JsonObjectSerializer.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. * Copyright (c) 2019-2020, Sergey Bugaev <bugaevc@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/JsonArraySerializer.h>
  8. #ifndef KERNEL
  9. # include <AK/JsonValue.h>
  10. #endif
  11. namespace AK {
  12. template<typename Builder>
  13. class JsonObjectSerializer {
  14. public:
  15. explicit JsonObjectSerializer(Builder& builder)
  16. : m_builder(builder)
  17. {
  18. (void)m_builder.append('{');
  19. }
  20. JsonObjectSerializer(const JsonObjectSerializer&) = delete;
  21. JsonObjectSerializer(JsonObjectSerializer&&) = delete;
  22. ~JsonObjectSerializer()
  23. {
  24. if (!m_finished)
  25. finish();
  26. }
  27. #ifndef KERNEL
  28. void add(StringView key, const JsonValue& value)
  29. {
  30. begin_item(key);
  31. value.serialize(m_builder);
  32. }
  33. #endif
  34. void add(StringView key, StringView value)
  35. {
  36. begin_item(key);
  37. (void)m_builder.append('"');
  38. (void)m_builder.append_escaped_for_json(value);
  39. (void)m_builder.append('"');
  40. }
  41. void add(StringView key, const String& value)
  42. {
  43. begin_item(key);
  44. (void)m_builder.append('"');
  45. (void)m_builder.append_escaped_for_json(value);
  46. (void)m_builder.append('"');
  47. }
  48. void add(StringView key, const char* value)
  49. {
  50. begin_item(key);
  51. (void)m_builder.append('"');
  52. (void)m_builder.append_escaped_for_json(value);
  53. (void)m_builder.append('"');
  54. }
  55. void add(StringView key, bool value)
  56. {
  57. begin_item(key);
  58. (void)m_builder.append(value ? "true" : "false");
  59. }
  60. void add(StringView key, int value)
  61. {
  62. begin_item(key);
  63. (void)m_builder.appendff("{}", value);
  64. }
  65. void add(StringView key, unsigned value)
  66. {
  67. begin_item(key);
  68. (void)m_builder.appendff("{}", value);
  69. }
  70. void add(StringView key, long value)
  71. {
  72. begin_item(key);
  73. (void)m_builder.appendff("{}", value);
  74. }
  75. void add(StringView key, long unsigned value)
  76. {
  77. begin_item(key);
  78. (void)m_builder.appendff("{}", value);
  79. }
  80. void add(StringView key, long long value)
  81. {
  82. begin_item(key);
  83. (void)m_builder.appendff("{}", value);
  84. }
  85. void add(StringView key, long long unsigned value)
  86. {
  87. begin_item(key);
  88. (void)m_builder.appendff("{}", value);
  89. }
  90. #ifndef KERNEL
  91. void add(StringView key, double value)
  92. {
  93. begin_item(key);
  94. (void)m_builder.appendff("{}", value);
  95. }
  96. #endif
  97. JsonArraySerializer<Builder> add_array(StringView key)
  98. {
  99. begin_item(key);
  100. return JsonArraySerializer(m_builder);
  101. }
  102. JsonObjectSerializer<Builder> add_object(StringView key)
  103. {
  104. begin_item(key);
  105. return JsonObjectSerializer(m_builder);
  106. }
  107. void finish()
  108. {
  109. VERIFY(!m_finished);
  110. m_finished = true;
  111. (void)m_builder.append('}');
  112. }
  113. private:
  114. void begin_item(StringView key)
  115. {
  116. if (!m_empty)
  117. (void)m_builder.append(',');
  118. m_empty = false;
  119. (void)m_builder.append('"');
  120. (void)m_builder.append_escaped_for_json(key);
  121. (void)m_builder.append("\":");
  122. }
  123. Builder& m_builder;
  124. bool m_empty { true };
  125. bool m_finished { false };
  126. };
  127. template<typename Builder>
  128. JsonObjectSerializer<Builder> JsonArraySerializer<Builder>::add_object()
  129. {
  130. begin_item();
  131. return JsonObjectSerializer(m_builder);
  132. }
  133. }
  134. using AK::JsonObjectSerializer;