681b62ee77
Signed-off-by: Roman Yeryomin <roman@advem.lv> git-svn-id: svn://svn.openwrt.org/openwrt/packages@28233 3c298f89-4303-0410-b956-a3cf2f4a3e73
51 lines
1.4 KiB
Diff
51 lines
1.4 KiB
Diff
This patch adds a function which can be used to update
|
|
json key values on all levels, not just one, automagically
|
|
adding new keys to objects which do not exist in old object.
|
|
|
|
Signed-off-by: Roman Yeryomin <roman@advem.lv>
|
|
|
|
--- a/src/value.c 2011-04-21 13:15:58.000000000 +0300
|
|
+++ b/src/value.c 2011-07-01 00:23:05.105103308 +0300
|
|
@@ -215,6 +215,41 @@
|
|
return 0;
|
|
}
|
|
|
|
+int json_object_deep_update(json_t *object, json_t *other)
|
|
+{
|
|
+ void *iter;
|
|
+
|
|
+ if(!json_is_object(object) || !json_is_object(other))
|
|
+ return -1;
|
|
+
|
|
+ iter = json_object_iter(other);
|
|
+ while(iter) {
|
|
+ const char *key;
|
|
+ json_t *value;
|
|
+
|
|
+ key = json_object_iter_key(iter);
|
|
+ value = json_object_iter_value(iter);
|
|
+
|
|
+ if (!json_is_object(value)) {
|
|
+ if ( json_object_set_nocheck( object, key, value ) )
|
|
+ return -1;
|
|
+ } else {
|
|
+ json_t *subobj = json_object_get(object, key);
|
|
+ if (!subobj) {
|
|
+ json_object_set_nocheck( object, key, value );
|
|
+ iter = json_object_iter_next(other, iter);
|
|
+ continue;
|
|
+ }
|
|
+ if (json_object_deep_update( subobj, value ) == -1)
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ iter = json_object_iter_next(other, iter);
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
void *json_object_iter(json_t *json)
|
|
{
|
|
json_object_t *object;
|