From 47bf50f557d1f71a9a54fca7084316f422e9f44e Mon Sep 17 00:00:00 2001 From: Jakob Olsson <jakob.olsson@iopsys.eu> Date: Wed, 2 Oct 2019 14:55:40 +0200 Subject: [PATCH] overwrite nested arrays when necessary --- api.c | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/api.c b/api.c index 9048ccd..34b1633 100644 --- a/api.c +++ b/api.c @@ -234,7 +234,7 @@ int add_val(struct json_object *ptr, char *key, char *val, enum json_type type) int set_by_string(struct json_object **src, char *fmt, char *val, enum json_type type) { - struct json_object *ptr, *tmp; + struct json_object *ptr, *outer_obj, *tmp; const char *delimiter = "."; char fmt_cpy[1024] = {0}, parsed_key[32] = {0}; char *p, *key = fmt; @@ -249,7 +249,7 @@ int set_by_string(struct json_object **src, char *fmt, char *val, enum json_type printf("format = %s\n", fmt); printf("set val = %s\n", val); - ptr = tmp = *src; + ptr = outer_obj = *src; if (!fmt) goto add_key; @@ -273,21 +273,30 @@ int set_by_string(struct json_object **src, char *fmt, char *val, enum json_type /* if we need to step further and currently marked value isnt an object, we need to overwrite it */ - json_object_object_get_ex(tmp, parsed_key, &ptr); + json_object_object_get_ex(outer_obj, parsed_key, &ptr); if (!json_object_is_type(ptr, json_type_object) && !json_object_is_type(ptr, json_type_array)) { ptr = json_object_new_object(); - json_object_object_add(tmp, parsed_key, ptr); + json_object_object_add(outer_obj, parsed_key, ptr); } - /* TODO: make enums for rv of get_idx */ if (len > 0) { for (int i = 0; i < len; i++) { printf("%s %d, ptr = %s\n", __func__, __LINE__, json_object_get_string(ptr)); if (ptr && json_object_get_type(ptr) == json_type_array) { printf("%s %d\n", __func__, __LINE__); - if (idx[i] > -1 && idx[i] < json_object_array_length(ptr)) - ptr = json_object_array_get_idx(ptr, idx[i]); + if (idx[i] > -1 && idx[i] < json_object_array_length(ptr)) { + tmp = json_object_array_get_idx(ptr, idx[i]); + if (!json_object_is_type(tmp, json_type_object)) { + struct json_object *obj = json_object_new_object(); + if (!obj) + return -1; + + json_object_array_put_idx(ptr, idx[i], obj); + tmp = json_object_array_get_idx(ptr, idx[i]); + } + ptr = tmp; + } else { printf("%s %d\n", __func__, __LINE__); if (i == len - 1) @@ -300,16 +309,16 @@ int set_by_string(struct json_object **src, char *fmt, char *val, enum json_type } } else { ptr = json_object_new_array(); - printf("%s %d type=%s, ptr_type=%s\n", __func__, __LINE__, json_type_to_name(json_object_get_type(tmp)), json_type_to_name(json_object_get_type(ptr))); - printf("tmp=%s\n", json_object_get_string(tmp)); + printf("%s %d type=%s, ptr_type=%s\n", __func__, __LINE__, json_type_to_name(json_object_get_type(outer_obj)), json_type_to_name(json_object_get_type(ptr))); + printf("outer_obj=%s\n", json_object_get_string(outer_obj)); printf("ptr=%s\n", json_object_get_string(ptr)); printf("key=%s\n", key); - json_object_object_add(tmp, parsed_key, ptr); + json_object_object_add(outer_obj, parsed_key, ptr); if (i == len - 1) { json_object_array_add(ptr, json_object_new_object()); ptr = json_object_array_get_idx(ptr, json_object_array_length(ptr) - 1); } - //json_object_array_add(tmp, ptr); + //json_object_array_add(outer_obj, ptr); } } } @@ -317,16 +326,16 @@ int set_by_string(struct json_object **src, char *fmt, char *val, enum json_type /* create key object if it does not exist */ if (!ptr) { ptr = json_object_new_object(); - if (json_object_get_type(tmp) == json_type_array) - json_object_array_add(tmp, ptr); - else if (json_object_get_type(tmp) == json_type_object) - json_object_object_add(tmp, parsed_key, ptr); + if (json_object_get_type(outer_obj) == json_type_array) + json_object_array_add(outer_obj, ptr); + else if (json_object_get_type(outer_obj) == json_type_object) + json_object_object_add(outer_obj, parsed_key, ptr); printf("%s %d: ptr=%s\n", __func__, __LINE__, json_object_get_string(ptr)); - printf("%s %d: tmp=%s\n", __func__, __LINE__, json_object_get_string(tmp)); + printf("%s %d: outer_obj=%s\n", __func__, __LINE__, json_object_get_string(outer_obj)); } } - tmp = ptr; + outer_obj = ptr; } printf("%s %d key=%s\n", __func__, __LINE__, parsed_key); -- GitLab