summaryrefslogtreecommitdiff
path: root/json_object.c
diff options
context:
space:
mode:
authorHelmut Schaa <helmut.schaa@googlemail.com>2016-01-13 15:40:02 +0100
committerHelmut Schaa <helmut.schaa@googlemail.com>2016-01-13 15:56:38 +0100
commit00e475c43478f8fe8522218d8da8c58938a31450 (patch)
tree3345f5f93fed8811d837cf0c3d187552af4e5fcd /json_object.c
parent537f8bcbdbdc10ffa7673199a0be82ca4eb56ec8 (diff)
downloadjson-c-00e475c43478f8fe8522218d8da8c58938a31450.tar.gz
Add utility function for comparing json_objects
Diffstat (limited to 'json_object.c')
-rw-r--r--json_object.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/json_object.c b/json_object.c
index e611103..38e69c6 100644
--- a/json_object.c
+++ b/json_object.c
@@ -992,3 +992,84 @@ struct json_object* json_object_array_get_idx(const struct json_object *jso,
return (struct json_object*)array_list_get_idx(jso->o.c_array, idx);
}
+static int json_array_equal(struct json_object* jso1,
+ struct json_object* jso2)
+{
+ int len, i;
+
+ len = json_object_array_length(jso1);
+ if (len != json_object_array_length(jso2))
+ return 0;
+
+ for (i = 0; i < len; i++) {
+ if (!json_object_equal(json_object_array_get_idx(jso1, i),
+ json_object_array_get_idx(jso2, i)))
+ return 0;
+ }
+ return 1;
+}
+
+static int json_object_all_values_equal(struct json_object* jso1,
+ struct json_object* jso2)
+{
+ struct json_object_iter iter;
+ struct json_object *sub;
+
+ /* Iterate over jso1 keys and see if they exist and are equal in jso2 */
+ json_object_object_foreachC(jso1, iter) {
+ if (!lh_table_lookup_ex(jso1->o.c_object, (void*)iter.key,
+ (void**)&sub))
+ return 0;
+ if (!json_object_equal(iter.val, sub))
+ return 0;
+ }
+
+ /* Iterate over jso2 keys to see if any exist that are not in jso1 */
+ json_object_object_foreachC(jso2, iter) {
+ if (!lh_table_lookup_ex(jso1->o.c_object, (void*)iter.key,
+ (void**)&sub))
+ return 0;
+ }
+
+ return 1;
+}
+
+int json_object_equal(struct json_object* jso1, struct json_object* jso2)
+{
+ if (jso1 == jso2)
+ return 1;
+
+ if (!jso1 || !jso2)
+ return 0;
+
+ if (jso1->o_type != jso2->o_type)
+ return 0;
+
+ switch(jso1->o_type) {
+ case json_type_boolean:
+ return (jso1->o.c_boolean == jso2->o.c_boolean);
+
+ case json_type_double:
+ return (jso1->o.c_double == jso2->o.c_double);
+
+ case json_type_int:
+ return (jso1->o.c_int64 == jso2->o.c_int64);
+
+ case json_type_string:
+ return (jso1->o.c_string.len == jso2->o.c_string.len &&
+ memcmp(get_string_component(jso1),
+ get_string_component(jso2),
+ jso1->o.c_string.len) == 0);
+
+ case json_type_object:
+ return json_object_all_values_equal(jso1, jso2);
+
+ case json_type_array:
+ return json_array_equal(jso1, jso2);
+
+ case json_type_null:
+ return 1;
+ };
+
+ return 0;
+}