2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include <json-glib/json-glib.h>
27 #define PATH_DELIM '.'
28 #define MAX_PRECISION 15
29 #define GVAR_VALUES "values"
30 #define GVAR_TYPES "types"
34 static std::string __double_to_string(double in)
36 /* Locale-independent double-to-string conversion */
37 int prec = MAX_PRECISION;
39 std::ostringstream ostr;
41 ostr.imbue(std::locale("C"));
42 ostr << std::setprecision(prec) << in;
45 if (out.find('e') == std::string::npos)
48 /* If 'out' is in scientific notation */
50 ostr.str(std::string());
51 ostr.imbue(std::locale("C"));
53 /* Get the number of fraction digits to precisely print the number */
54 double number = in * 10;
55 while (static_cast<int>(number) == 0) {
60 ostr << std::fixed << std::setprecision(prec) << in;
63 /* Remove trailing '0' */
64 std::size_t found = out.find_last_not_of("0");
65 if (found != std::string::npos)
68 /* If 'out' ends with '.' */
69 if (out.back() == '.')
70 out.erase(out.end() - 1);
75 static double __string_to_double(const char* in)
77 IF_FAIL_RETURN_TAG(in, 0, _E, "Parameter NULL");
81 /* Locale-independent string-to-double conversion */
82 std::istringstream istr(in);
83 istr.imbue(std::locale("C"));
89 SO_EXPORT Json::Json() :
92 JsonObject *obj = json_object_new();
93 IF_FAIL_VOID_TAG(obj, _E, "Json object construction failed");
95 __jsonNode = json_node_new(JSON_NODE_OBJECT);
97 json_object_unref(obj);
98 _E("Json object construction failed");
101 json_node_set_object(__jsonNode, obj);
102 json_object_unref(obj);
105 SO_EXPORT Json::Json(const Json &j)
108 __jsonNode = json_node_copy(j.__jsonNode);
109 IF_FAIL_VOID_TAG(__jsonNode, _E, "Json object construction failed");
112 SO_EXPORT Json::Json(const char *s)
118 __parse(EMPTY_JSON_OBJECT);
122 SO_EXPORT Json::Json(const std::string &s)
126 __parse(EMPTY_JSON_OBJECT);
132 SO_EXPORT Json::~Json()
137 void Json::__parse(const char *s)
140 JsonParser *parser = NULL;
141 JsonNode *root = NULL;
143 parser = json_parser_new();
144 IF_FAIL_VOID_TAG(parser, _E, "Memory allocation failed");
146 result = json_parser_load_from_data(parser, s, -1, NULL);
147 IF_FAIL_CATCH_TAG(result, _E, "Parsing failed");
149 root = json_parser_get_root(parser);
150 IF_FAIL_CATCH_TAG(root, _E, "Getting root failed");
152 __jsonNode = json_node_copy(root);
153 IF_FAIL_CATCH_TAG(__jsonNode, _E, "Copying failed");
157 g_object_unref(parser);
160 void Json::__release()
163 json_node_free(__jsonNode);
168 SO_EXPORT bool Json::valid()
170 return (__jsonNode != NULL);
173 SO_EXPORT Json& Json::operator=(const Json &j)
176 __jsonNode = json_node_copy(j.__jsonNode);
178 _E("Json object copy failed");
183 SO_EXPORT Json& Json::operator=(const char *s)
189 __parse(EMPTY_JSON_OBJECT);
194 SO_EXPORT Json& Json::operator=(const std::string &s)
198 __parse(EMPTY_JSON_OBJECT);
205 SO_EXPORT bool Json::operator==(const Json &rhs)
207 return __nodeEq(__jsonNode, rhs.__jsonNode);
210 SO_EXPORT bool Json::operator!=(const Json &rhs)
212 return !operator==(rhs);
215 char* Json::__strDup()
217 IF_FAIL_RETURN_TAG(__jsonNode, NULL, _E, "Json object not initialized");
219 JsonGenerator *jgen = NULL;
222 jgen = json_generator_new();
225 json_generator_set_root(jgen, __jsonNode);
226 output = json_generator_to_data(jgen, NULL);
227 IF_FAIL_CATCH(output);
229 g_object_unref(jgen);
234 g_object_unref(jgen);
237 _E("Memory allocation failed");
241 SO_EXPORT std::string Json::str()
244 char *_s = __strDup();
245 IF_FAIL_RETURN(_s, output = EMPTY_JSON_OBJECT);
253 static std::vector<std::string> __tokenize_path(std::string path)
255 std::vector<std::string> tokens;
256 std::size_t begin = 0;
257 std::size_t end = path.find(PATH_DELIM, 0);
259 while (end != std::string::npos) {
260 tokens.push_back(path.substr(begin, end - begin));
262 end = path.find(PATH_DELIM, begin);
265 tokens.push_back(path.substr(begin));
269 static JsonObject* __traverse(JsonNode *jnode, const char *path, bool force)
271 IF_FAIL_RETURN_TAG(jnode, NULL, _E, "Invalid parameter");
273 unsigned int depth = 0;
274 std::vector<std::string> pathToken;
275 JsonObject *jobj = NULL;
276 JsonObject *childObj = NULL;
277 JsonNode *childNode = NULL;
279 jobj = json_node_get_object(jnode);
280 IF_FAIL_RETURN(jobj, NULL);
283 pathToken = __tokenize_path(path);
285 for (depth = 0; depth < pathToken.size(); depth++) {
286 if (!json_object_has_member(jobj, pathToken[depth].c_str())) {
290 childObj = json_object_new();
291 IF_FAIL_RETURN_TAG(childObj, NULL, _E, "Memory allocation failed");
292 json_object_set_object_member(jobj, pathToken[depth].c_str(), childObj);
294 childNode = json_object_get_member(jobj, pathToken[depth].c_str());
295 IF_FAIL_RETURN(childNode && json_node_get_node_type(childNode) == JSON_NODE_OBJECT, NULL);
297 jobj = json_node_get_object(childNode);
298 IF_FAIL_RETURN(jobj, NULL);
304 SO_EXPORT bool Json::set(const char *path, const char *key, Json &val)
306 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
307 IF_FAIL_RETURN_TAG(key && val.__jsonNode, false, _E, "Invalid parameter");
309 JsonObject *jobj = __traverse(__jsonNode, path, true);
310 IF_FAIL_RETURN(jobj, false);
312 if (json_object_has_member(jobj, key))
313 json_object_remove_member(jobj, key);
315 json_object_set_member(jobj, key, val.__jsonNode);
316 val.__jsonNode = NULL;
322 SO_EXPORT bool Json::set(const char *path, const char *key, int val)
324 return set(path, key, static_cast<int64_t>(val));
327 SO_EXPORT bool Json::set(const char *path, const char *key, int64_t val)
329 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
330 IF_FAIL_RETURN_TAG(key, false, _E, "Invalid parameter");
332 JsonObject *jobj = __traverse(__jsonNode, path, true);
333 IF_FAIL_RETURN(jobj, false);
335 if (json_object_has_member(jobj, key))
336 json_object_remove_member(jobj, key);
338 json_object_set_int_member(jobj, key, val);
342 SO_EXPORT bool Json::set(const char *path, const char *key, double val)
344 return set(path, key, __double_to_string(val));
347 SO_EXPORT bool Json::set(const char *path, const char *key, std::string val)
349 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
350 IF_FAIL_RETURN_TAG(key, false, _E, "Invalid parameter");
352 JsonObject *jobj = __traverse(__jsonNode, path, true);
353 IF_FAIL_RETURN(jobj, false);
355 if (json_object_has_member(jobj, key)) {
356 json_object_remove_member(jobj, key);
359 json_object_set_string_member(jobj, key, val.c_str());
363 SO_EXPORT bool Json::set(const char *path, const char *key, GVariant *val)
365 #if JSON_CHECK_VERSION(0, 14, 0)
366 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
367 IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter");
369 const gchar *typeStr = g_variant_get_type_string(val);
370 IF_FAIL_RETURN_TAG(typeStr, false, _E, "GVariant manipulation failed");
372 json_node_t *node = json_gvariant_serialize(val);
373 IF_FAIL_RETURN_TAG(node, false, _E, "GVariant manipulation failed");
376 gvarJson.set(NULL, GVAR_TYPES, std::string(typeStr));
377 json_object_set_member(json_node_get_object(gvarJson.__jsonNode), GVAR_VALUES, node);
379 return set(path, key, gvarJson);
381 _E("Insufficient version of json-glib(" JSON_VERSION_S ")");
386 SO_EXPORT bool Json::get(const char *path, const char *key, Json *val)
388 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
389 IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter");
391 JsonObject *jobj = NULL;
392 JsonNode *node = NULL;
394 jobj = __traverse(__jsonNode, path, false);
395 IF_FAIL_RETURN(jobj && json_object_has_member(jobj, key), false);
397 node = json_object_dup_member(jobj, key);
398 IF_FAIL_RETURN_TAG(node, false, _E, "Memory allocation failed");
400 if (val->__jsonNode) {
401 json_node_free(val->__jsonNode);
403 val->__jsonNode = node;
408 static JsonNode* __get_value_node(JsonNode *jnode, const char *path, const char *key)
410 JsonNode *node = NULL;
411 JsonObject *jobj = NULL;
414 jobj = __traverse(jnode, path, false);
415 IF_FAIL_RETURN(jobj && json_object_has_member(jobj, key), NULL);
417 node = json_object_get_member(jobj, key);
418 ntype = json_node_get_node_type(node);
419 IF_FAIL_RETURN(ntype == JSON_NODE_VALUE, NULL);
424 SO_EXPORT bool Json::get(const char *path, const char *key, int *val)
426 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
427 IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter");
431 if (get(path, key, &v)) {
439 SO_EXPORT bool Json::get(const char *path, const char *key, int64_t *val)
441 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
442 IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter");
444 JsonNode *node = __get_value_node(__jsonNode, path, key);
445 IF_FAIL_RETURN(node, false);
447 GType vtype = json_node_get_value_type(node);
448 if (vtype == G_TYPE_INT64) {
449 *val = json_node_get_int(node);
450 } else if (vtype == G_TYPE_STRING) {
451 //TODO: if the string is not a number?
452 *val = static_cast<int64_t>(__string_to_double(json_node_get_string(node)));
460 SO_EXPORT bool Json::get(const char *path, const char *key, double *val)
462 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
463 IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter");
465 JsonNode *node = __get_value_node(__jsonNode, path, key);
466 IF_FAIL_RETURN(node, false);
468 GType vtype = json_node_get_value_type(node);
469 if (vtype == G_TYPE_DOUBLE) {
470 *val = json_node_get_double(node);
471 } else if (vtype == G_TYPE_INT64) {
472 *val = json_node_get_int(node);
473 } else if (vtype == G_TYPE_STRING) {
474 *val = __string_to_double(json_node_get_string(node));
482 SO_EXPORT bool Json::get(const char *path, const char *key, std::string *val)
484 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
485 IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter");
487 JsonNode *node = __get_value_node(__jsonNode, path, key);
488 IF_FAIL_RETURN(node, false);
490 GType vtype = json_node_get_value_type(node);
491 IF_FAIL_RETURN(vtype == G_TYPE_STRING, false);
493 const char *str_val = json_node_get_string(node);
494 IF_FAIL_RETURN_TAG(str_val, false, _E, "Getting string failed");
500 SO_EXPORT bool Json::get(const char *path, const char *key, GVariant **val)
502 #if JSON_CHECK_VERSION(0, 14, 0)
503 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
504 IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter");
508 ret = get(path, key, &gvarJson);
509 IF_FAIL_RETURN(ret, false);
511 std::string gvarTypes;
512 ret = gvarJson.get(NULL, GVAR_TYPES, &gvarTypes);
513 IF_FAIL_RETURN(ret, false);
516 ret = gvarJson.get(NULL, GVAR_VALUES, &gvarValues);
517 IF_FAIL_RETURN(ret, false);
520 *val = json_gvariant_deserialize(gvarValues.__jsonNode, gvarTypes.c_str(), &gerr);
522 IF_FAIL_RETURN(*val, false);
526 _E("Insufficient version of json-glib(" JSON_VERSION_S ")");
532 SO_EXPORT bool Json::remove(const char *path, const char *key)
534 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
535 IF_FAIL_RETURN_TAG(key, false, _E, "Invalid parameter");
537 JsonObject *jobj = __traverse(__jsonNode, path, true);
538 IF_FAIL_RETURN(jobj, false);
540 if (json_object_has_member(jobj, key))
541 json_object_remove_member(jobj, key);
546 static JsonArray* __get_array(JsonNode *jnode, const char *path, const char *key, bool force)
548 JsonNode *node = NULL;
549 JsonArray *arr = NULL;
550 JsonObject *jobj = NULL;
552 jobj = __traverse(jnode, path, force);
553 IF_FAIL_RETURN(jobj, NULL);
555 if (!json_object_has_member(jobj, key)) {
557 arr = json_array_new();
558 IF_FAIL_RETURN_TAG(arr, NULL, _E, "Memory allocation failed");
559 json_object_set_array_member(jobj, key, arr);
564 node = json_object_get_member(jobj, key);
565 IF_FAIL_RETURN_TAG(node && json_node_get_node_type(node) == JSON_NODE_ARRAY,
566 NULL, _W, "Type mismatched: %s", key);
568 return json_node_get_array(node);
571 SO_EXPORT int Json::getSize(const char *path, const char *key)
573 IF_FAIL_RETURN_TAG(this->__jsonNode, -1, _E, "Json object not initialized");
574 IF_FAIL_RETURN_TAG(key, -1, _E, "Invalid parameter");
576 JsonArray *jarr = __get_array(__jsonNode, path, key, false);
577 IF_FAIL_RETURN_TAG(jarr, -1, _D, "Mismatched data type");
579 return json_array_get_length(jarr);
582 SO_EXPORT bool Json::append(const char *path, const char *key, Json &val)
584 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
585 IF_FAIL_RETURN_TAG(key && val.__jsonNode, false, _E, "Invalid parameter");
587 JsonArray *arr = __get_array(__jsonNode, path, key, true);
588 IF_FAIL_RETURN(arr, false);
590 json_array_add_element(arr, val.__jsonNode);
591 val.__jsonNode = NULL;
597 SO_EXPORT bool Json::append(const char *path, const char *key, int val)
599 return append(path, key, static_cast<int64_t>(val));
602 SO_EXPORT bool Json::append(const char *path, const char *key, int64_t val)
604 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
605 IF_FAIL_RETURN_TAG(key, false, _E, "Invalid parameter");
607 JsonArray *arr = __get_array(__jsonNode, path, key, true);
608 IF_FAIL_RETURN(arr, false);
610 json_array_add_int_element(arr, val);
614 SO_EXPORT bool Json::append(const char *path, const char *key, double val)
616 return append(path, key, __double_to_string(val));
619 SO_EXPORT bool Json::append(const char *path, const char *key, std::string val)
621 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
622 IF_FAIL_RETURN_TAG(key, false, _E, "Invalid parameter");
624 JsonArray *arr = __get_array(__jsonNode, path, key, true);
625 IF_FAIL_RETURN(arr, false);
627 json_array_add_string_element(arr, val.c_str());
631 static JsonNode* __get_array_elem(JsonNode *jnode, const char *path, const char *key, int index)
633 JsonArray *jarr = __get_array(jnode, path, key, false);
634 IF_FAIL_RETURN_TAG(jarr, NULL, _W, "Mismatched data type");
636 int size = json_array_get_length(jarr);
637 IF_FAIL_RETURN(size > index, NULL);
639 JsonNode *node = json_array_get_element(jarr, index);
640 IF_FAIL_RETURN_TAG(node, NULL, _E, "Failed to get an array element");
645 SO_EXPORT bool Json::setAt(const char *path, const char *key, int index, Json &val)
647 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
648 IF_FAIL_RETURN_TAG(val.__jsonNode && key && index >= 0, false, _E, "Invalid parameter");
650 JsonNode *node = __get_array_elem(__jsonNode, path, key, index);
651 IF_FAIL_RETURN_TAG(node, false, _W, "Out of range");
653 JsonObject *obj = json_node_get_object(val.__jsonNode);
654 IF_FAIL_RETURN_TAG(obj, false, _E, "Getting object failed");
656 json_node_set_object(node, obj);
657 json_node_free(val.__jsonNode);
658 val.__jsonNode = NULL;
664 SO_EXPORT bool Json::setAt(const char *path, const char *key, int index, int val)
666 return setAt(path, key, index, static_cast<int64_t>(val));
669 SO_EXPORT bool Json::setAt(const char *path, const char *key, int index, int64_t val)
671 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
672 IF_FAIL_RETURN_TAG(key && index >= 0, false, _E, "Invalid parameter");
674 JsonNode *node = __get_array_elem(__jsonNode, path, key, index);
675 IF_FAIL_RETURN_TAG(node, false, _W, "Out of range");
676 IF_FAIL_RETURN_TAG(json_node_get_node_type(node) == JSON_NODE_VALUE, false, _E, "Type mismatched: %s[%d]", key, index);
678 json_node_set_int(node, val);
682 SO_EXPORT bool Json::setAt(const char *path, const char *key, int index, double val)
684 return setAt(path, key, index, __double_to_string(val));
687 SO_EXPORT bool Json::setAt(const char *path, const char *key, int index, std::string val)
689 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
690 IF_FAIL_RETURN_TAG(key && index >= 0, false, _E, "Invalid parameter");
692 JsonNode *node = __get_array_elem(__jsonNode, path, key, index);
693 IF_FAIL_RETURN_TAG(node, false, _W, "Out of range");
694 IF_FAIL_RETURN_TAG(json_node_get_node_type(node) == JSON_NODE_VALUE, false, _E, "Type mismatched: %s[%d]", key, index);
696 json_node_set_string(node, val.c_str());
700 SO_EXPORT bool Json::getAt(const char *path, const char *key, int index, Json *val)
702 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
703 IF_FAIL_RETURN_TAG(key && val && index >= 0, false, _E, "Invalid parameter");
705 JsonNode *node = __get_array_elem(__jsonNode, path, key, index);
706 IF_FAIL_RETURN(node, false);
708 JsonNode *nodeCopy = json_node_copy(node);
709 IF_FAIL_RETURN_TAG(nodeCopy, false, _E, "Memory allocation failed");
711 if (val->__jsonNode) {
712 json_node_free(val->__jsonNode);
714 val->__jsonNode = nodeCopy;
719 SO_EXPORT bool Json::getAt(const char *path, const char *key, int index, int *val)
721 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
722 IF_FAIL_RETURN_TAG(key && val && index >= 0, false, _E, "Invalid parameter");
725 if (getAt(path, key, index, &v)) {
733 SO_EXPORT bool Json::getAt(const char *path, const char *key, int index, int64_t *val)
735 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
736 IF_FAIL_RETURN_TAG(key && val && index >= 0, false, _E, "Invalid parameter");
738 JsonNode *node = __get_array_elem(__jsonNode, path, key, index);
739 IF_FAIL_RETURN(node, false);
741 JsonNodeType ntype = json_node_get_node_type(node);
742 IF_FAIL_RETURN_TAG(ntype == JSON_NODE_VALUE, false, _E, "Type mismatched: %s", key);
744 GType vtype = json_node_get_value_type(node);
745 if (vtype == G_TYPE_INT64) {
746 *val = json_node_get_int(node);
747 } else if (vtype == G_TYPE_STRING) {
748 *val = static_cast<int64_t>(__string_to_double(json_node_get_string(node)));
750 _E("Type mismatched: %s", key);
757 SO_EXPORT bool Json::getAt(const char *path, const char *key, int index, double *val)
759 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
760 IF_FAIL_RETURN_TAG(key && val && index >= 0, false, _E, "Invalid parameter");
762 JsonNode *node = __get_array_elem(__jsonNode, path, key, index);
763 IF_FAIL_RETURN(node, false);
765 JsonNodeType ntype = json_node_get_node_type(node);
766 IF_FAIL_RETURN_TAG(ntype == JSON_NODE_VALUE, false, _E, "Type mismatched: %s", key);
768 GType vtype = json_node_get_value_type(node);
769 if (vtype == G_TYPE_DOUBLE) {
770 *val = json_node_get_double(node);
771 } else if (vtype == G_TYPE_INT64) {
772 *val = json_node_get_int(node);
773 } else if (vtype == G_TYPE_STRING) {
774 *val = __string_to_double(json_node_get_string(node));
776 _E("Type mismatched: %s", key);
783 SO_EXPORT bool Json::getAt(const char *path, const char *key, int index, std::string *val)
785 IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "Json object not initialized");
786 IF_FAIL_RETURN_TAG(key && val && index >= 0, false, _E, "Invalid parameter");
788 JsonNode *node = __get_array_elem(__jsonNode, path, key, index);
789 IF_FAIL_RETURN(node, false);
791 JsonNodeType ntype = json_node_get_node_type(node);
792 IF_FAIL_RETURN_TAG(ntype == JSON_NODE_VALUE, false, _E, "Type mismatched: %s", key);
794 GType vtype = json_node_get_value_type(node);
795 IF_FAIL_RETURN_TAG(vtype == G_TYPE_STRING, false, _E, "Type mismatched: %s", key);
797 const char *str_val = json_node_get_string(node);
798 IF_FAIL_RETURN_TAG(str_val, false, _E, "Getting string failed");
804 bool Json::__getMembers(json_node_t *node, std::list<std::string> &list)
806 IF_FAIL_RETURN(node, false);
809 JsonObject *jobj = json_node_get_object(node);
810 IF_FAIL_RETURN_TAG(jobj, false, _E, "Getting Json object failed");
812 GList *members = json_object_get_members(jobj);
813 IF_FAIL_RETURN(members, true);
815 for (GList *it = g_list_first(members); it; it = g_list_next(it)) {
816 const char *key = static_cast<const char*>(it->data);
819 g_list_free(members);
820 _E("Member list extraction failed");
827 g_list_free(members);
831 SO_EXPORT bool Json::getKeys(std::list<std::string>* list)
833 IF_FAIL_RETURN_TAG(list, false, _E, "Invalid parameter");
834 return __getMembers(__jsonNode, *list);
837 bool Json::__nodeEq(json_node_t *lhs, json_node_t *rhs)
839 IF_FAIL_RETURN(lhs && rhs, false);
841 JsonNodeType ltype = json_node_get_node_type(lhs);
842 JsonNodeType rtype = json_node_get_node_type(rhs);
843 IF_FAIL_RETURN(ltype == rtype, false);
846 case JSON_NODE_VALUE:
847 IF_FAIL_RETURN(__valueEq(lhs, rhs), false);
849 case JSON_NODE_OBJECT:
850 IF_FAIL_RETURN(__objectEq(lhs, rhs), false);
852 case JSON_NODE_ARRAY:
853 IF_FAIL_RETURN(__arrayEq(lhs, rhs), false);
856 _W("Unsupported type");
863 bool Json::__valueEq(json_node_t *lhs, json_node_t *rhs)
865 GType ltype = json_node_get_value_type(lhs);
866 GType rtype = json_node_get_value_type(rhs);
867 IF_FAIL_RETURN(ltype == rtype, false);
871 return json_node_get_int(lhs) == json_node_get_int(rhs);
873 return json_node_get_double(lhs) == json_node_get_double(rhs);
875 return STR_EQ(json_node_get_string(lhs), json_node_get_string(rhs));
877 _W("Unsupported type");
882 bool Json::__objectEq(json_node_t *lhs, json_node_t *rhs)
884 std::list<std::string> lm, rm;
885 IF_FAIL_RETURN(__getMembers(lhs, lm), false);
886 IF_FAIL_RETURN(__getMembers(rhs, rm), false);
887 IF_FAIL_RETURN(lm.size() == rm.size(), false);
892 std::list<std::string>::iterator lit, rit;
896 while (lit != lm.end()) {
897 IF_FAIL_RETURN(*lit == *rit, false);
899 json_node_t *lhsChild = json_object_get_member(json_node_get_object(lhs), (*lit).c_str());
900 json_node_t *rhsChild = json_object_get_member(json_node_get_object(rhs), (*rit).c_str());
901 IF_FAIL_RETURN(__nodeEq(lhsChild, rhsChild), false);
910 bool Json::__arrayEq(json_node_t *lhs, json_node_t *rhs)
912 JsonArray *larr = json_node_get_array(lhs);
913 JsonArray *rarr = json_node_get_array(rhs);
915 int size = json_array_get_length(larr);
916 IF_FAIL_RETURN(size == static_cast<int>(json_array_get_length(rarr)), false);
918 for (int i = 0; i < size; ++i) {
919 json_node_t *lhsChild = json_array_get_element(larr, i);
920 json_node_t *rhsChild = json_array_get_element(rarr, i);
921 IF_FAIL_RETURN(__nodeEq(lhsChild, rhsChild), false);