jsoncpp_json_serializer.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. // Copyright 2023 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // https://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "jsoncpp_json_serializer.h"
  15. #include "null_json_serializer.h"
  16. #include <cm3p/json/json.h>
  17. #include <cstdlib>
  18. #include <memory>
  19. namespace dap {
  20. namespace json {
  21. JsonCppDeserializer::JsonCppDeserializer(const std::string& str)
  22. : json(new Json::Value(JsonCppDeserializer::parse(str))), ownsJson(true) {}
  23. JsonCppDeserializer::JsonCppDeserializer(const Json::Value* json)
  24. : json(json), ownsJson(false) {}
  25. JsonCppDeserializer::~JsonCppDeserializer() {
  26. if (ownsJson) {
  27. delete json;
  28. }
  29. }
  30. bool JsonCppDeserializer::deserialize(dap::boolean* v) const {
  31. if (!json->isBool()) {
  32. return false;
  33. }
  34. *v = json->asBool();
  35. return true;
  36. }
  37. bool JsonCppDeserializer::deserialize(dap::integer* v) const {
  38. if (!json->isInt64()) {
  39. return false;
  40. }
  41. *v = json->asInt64();
  42. return true;
  43. }
  44. bool JsonCppDeserializer::deserialize(dap::number* v) const {
  45. if (!json->isNumeric()) {
  46. return false;
  47. }
  48. *v = json->asDouble();
  49. return true;
  50. }
  51. bool JsonCppDeserializer::deserialize(dap::string* v) const {
  52. if (!json->isString()) {
  53. return false;
  54. }
  55. *v = json->asString();
  56. return true;
  57. }
  58. bool JsonCppDeserializer::deserialize(dap::object* v) const {
  59. v->reserve(json->size());
  60. for (auto i = json->begin(); i != json->end(); i++) {
  61. JsonCppDeserializer d(&*i);
  62. dap::any val;
  63. if (!d.deserialize(&val)) {
  64. return false;
  65. }
  66. (*v)[i.name()] = val;
  67. }
  68. return true;
  69. }
  70. bool JsonCppDeserializer::deserialize(dap::any* v) const {
  71. if (json->isBool()) {
  72. *v = dap::boolean(json->asBool());
  73. } else if (json->type() == Json::ValueType::realValue) {
  74. // json->isDouble() returns true for integers as well, so we need to
  75. // explicitly look for the realValue type.
  76. *v = dap::number(json->asDouble());
  77. } else if (json->isInt64()) {
  78. *v = dap::integer(json->asInt64());
  79. } else if (json->isString()) {
  80. *v = json->asString();
  81. } else if (json->isObject()) {
  82. dap::object obj;
  83. if (!deserialize(&obj)) {
  84. return false;
  85. }
  86. *v = obj;
  87. } else if (json->isArray()) {
  88. dap::array<any> arr;
  89. if (!deserialize(&arr)) {
  90. return false;
  91. }
  92. *v = arr;
  93. } else if (json->isNull()) {
  94. *v = null();
  95. } else {
  96. return false;
  97. }
  98. return true;
  99. }
  100. size_t JsonCppDeserializer::count() const {
  101. return json->size();
  102. }
  103. bool JsonCppDeserializer::array(
  104. const std::function<bool(dap::Deserializer*)>& cb) const {
  105. if (!json->isArray()) {
  106. return false;
  107. }
  108. for (const auto& value : *json) {
  109. JsonCppDeserializer d(&value);
  110. if (!cb(&d)) {
  111. return false;
  112. }
  113. }
  114. return true;
  115. }
  116. bool JsonCppDeserializer::field(
  117. const std::string& name,
  118. const std::function<bool(dap::Deserializer*)>& cb) const {
  119. if (!json->isObject()) {
  120. return false;
  121. }
  122. auto value = json->find(name.data(), name.data() + name.size());
  123. if (value == nullptr) {
  124. return cb(&NullDeserializer::instance);
  125. }
  126. JsonCppDeserializer d(value);
  127. return cb(&d);
  128. }
  129. Json::Value JsonCppDeserializer::parse(const std::string& text) {
  130. Json::CharReaderBuilder builder;
  131. auto jsonReader = std::unique_ptr<Json::CharReader>(builder.newCharReader());
  132. Json::Value json;
  133. std::string error;
  134. if (!jsonReader->parse(text.data(), text.data() + text.size(), &json,
  135. &error)) {
  136. // cppdap expects that the JSON layer does not throw exceptions.
  137. std::abort();
  138. }
  139. return json;
  140. }
  141. JsonCppSerializer::JsonCppSerializer()
  142. : json(new Json::Value()), ownsJson(true) {}
  143. JsonCppSerializer::JsonCppSerializer(Json::Value* json)
  144. : json(json), ownsJson(false) {}
  145. JsonCppSerializer::~JsonCppSerializer() {
  146. if (ownsJson) {
  147. delete json;
  148. }
  149. }
  150. std::string JsonCppSerializer::dump() const {
  151. Json::StreamWriterBuilder writer;
  152. return Json::writeString(writer, *json);
  153. }
  154. bool JsonCppSerializer::serialize(dap::boolean v) {
  155. *json = (bool)v;
  156. return true;
  157. }
  158. bool JsonCppSerializer::serialize(dap::integer v) {
  159. *json = (Json::LargestInt)v;
  160. return true;
  161. }
  162. bool JsonCppSerializer::serialize(dap::number v) {
  163. *json = (double)v;
  164. return true;
  165. }
  166. bool JsonCppSerializer::serialize(const dap::string& v) {
  167. *json = v;
  168. return true;
  169. }
  170. bool JsonCppSerializer::serialize(const dap::object& v) {
  171. if (!json->isObject()) {
  172. *json = Json::Value(Json::objectValue);
  173. }
  174. for (auto& it : v) {
  175. JsonCppSerializer s(&(*json)[it.first]);
  176. if (!s.serialize(it.second)) {
  177. return false;
  178. }
  179. }
  180. return true;
  181. }
  182. bool JsonCppSerializer::serialize(const dap::any& v) {
  183. if (v.is<dap::boolean>()) {
  184. *json = (bool)v.get<dap::boolean>();
  185. } else if (v.is<dap::integer>()) {
  186. *json = (Json::LargestInt)v.get<dap::integer>();
  187. } else if (v.is<dap::number>()) {
  188. *json = (double)v.get<dap::number>();
  189. } else if (v.is<dap::string>()) {
  190. *json = v.get<dap::string>();
  191. } else if (v.is<dap::object>()) {
  192. // reachable if dap::object nested is inside other dap::object
  193. return serialize(v.get<dap::object>());
  194. } else if (v.is<dap::null>()) {
  195. } else {
  196. // reachable if array or custom serialized type is nested inside other
  197. auto type = get_any_type(v);
  198. auto value = get_any_val(v);
  199. if (type && value) {
  200. return type->serialize(this, value);
  201. }
  202. return false;
  203. }
  204. return true;
  205. }
  206. bool JsonCppSerializer::array(size_t count,
  207. const std::function<bool(dap::Serializer*)>& cb) {
  208. *json = Json::Value(Json::arrayValue);
  209. for (size_t i = 0; i < count; i++) {
  210. JsonCppSerializer s(&(*json)[Json::Value::ArrayIndex(i)]);
  211. if (!cb(&s)) {
  212. return false;
  213. }
  214. }
  215. return true;
  216. }
  217. bool JsonCppSerializer::object(
  218. const std::function<bool(dap::FieldSerializer*)>& cb) {
  219. struct FS : public FieldSerializer {
  220. Json::Value* const json;
  221. FS(Json::Value* json) : json(json) {}
  222. bool field(const std::string& name, const SerializeFunc& cb) override {
  223. JsonCppSerializer s(&(*json)[name]);
  224. auto res = cb(&s);
  225. if (s.removed) {
  226. json->removeMember(name);
  227. }
  228. return res;
  229. }
  230. };
  231. *json = Json::Value(Json::objectValue);
  232. FS fs{json};
  233. return cb(&fs);
  234. }
  235. void JsonCppSerializer::remove() {
  236. removed = true;
  237. }
  238. } // namespace json
  239. } // namespace dap