]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
func_json: Fix JSON parsing issues.
authorNaveen Albert <asterisk@phreaknet.org>
Sun, 26 Feb 2023 15:40:15 +0000 (15:40 +0000)
committerJoshua Colp <jcolp@sangoma.com>
Thu, 16 Mar 2023 15:42:41 +0000 (10:42 -0500)
Fix issue with returning empty instead of dumping
the JSON string when recursing.

Also adds a unit test to capture this fix.

ASTERISK-30441 #close

Change-Id: If0bde9f3fe84f7af485e0838205cc21e0f752a85

funcs/func_json.c

index 6672c5871e8a81a176abfcd8345b89d92beefa18..8bfcd4cfb170093585fde0aaf47f856ee6e43531 100644 (file)
@@ -174,7 +174,11 @@ static int parse_node(char **key, char *currentkey, char *nestchar, int count, s
                                previouskey = currentkey;
                                currentkey = strsep(key, nestchar); /* retrieve the desired index */
                                ast_debug(1, "Recursing on object (key was '%s' and is now '%s')\n", previouskey, currentkey);
-                               if (parse_node(key, currentkey, nestchar, count, ast_json_object_get(jsonval, currentkey), buf, len, depth)) { /* recurse on this node */
+                               if (!currentkey) { /* this is the end, so just dump the object */
+                                       char *result2 = ast_json_dump_string(jsonval);
+                                       ast_copy_string(buf, result2, len);
+                                       ast_json_free(result2);
+                               } else if (parse_node(key, currentkey, nestchar, count, ast_json_object_get(jsonval, currentkey), buf, len, depth)) { /* recurse on this node */
                                        return -1;
                                }
                        }
@@ -305,6 +309,7 @@ AST_TEST_DEFINE(test_JSON_DECODE)
                {"{ \"path\": { \"to\": { \"arr\": [ {\"name\": \"John Smith\", \"phone\": \"123\"}, {\"name\": \"Jane Doe\", \"phone\": \"234\"} ] } } }", ",c", "path.to.arr.0.name", "John Smith"},
                {"{ \"path\": { \"to\": { \"arr\": [ {\"name\": 1, \"phone\": 123}, {\"name\": 2, \"phone\": 234} ] } } }", ",c", "path.to.arr.0.name", "1"},
                {"{ \"path\": { \"to\": { \"arr\": [ {\"name\": [ \"item11\", \"item12\" ], \"phone\": [ \"item13\", \"item14\" ]}, {\"name\": [ \"item15\", \"item16\" ], \"phone\": [ \"item17\", \"item18\" ]} ] } } }", ",c", "path.to.arr.0.name.1", "item12"},
+               {"{ \"startId\": \"foobar\", \"abcd\": { \"id\": \"abcd\", \"type\": \"EXT\" }, \"bcde\": { \"id\": \"bcde\", \"type\": \"CONDITION\" }, \"defg\": { \"id\": \"defg\", \"type\": \"EXT\" }, \"efgh\": { \"id\": \"efgh\", \"type\": \"VOICEMAIL\" } }", "", "bcde", "{\"id\":\"bcde\",\"type\":\"CONDITION\"}"},
        };
 
        switch (cmd) {