diff options
author | Helmut Schaa <helmut.schaa@googlemail.com> | 2016-01-13 15:40:02 +0100 |
---|---|---|
committer | Helmut Schaa <helmut.schaa@googlemail.com> | 2016-01-13 15:56:38 +0100 |
commit | 00e475c43478f8fe8522218d8da8c58938a31450 (patch) | |
tree | 3345f5f93fed8811d837cf0c3d187552af4e5fcd /json_object.c | |
parent | 537f8bcbdbdc10ffa7673199a0be82ca4eb56ec8 (diff) | |
download | json-c-00e475c43478f8fe8522218d8da8c58938a31450.tar.gz |
Add utility function for comparing json_objects
Diffstat (limited to 'json_object.c')
-rw-r--r-- | json_object.c | 81 |
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; +} |