Sfoglia il codice sorgente

fix json.loads() with empty object

lyon 2 anni fa
parent
commit
f10c3235bc

+ 43 - 1
examples/json/json_loads.py

@@ -93,5 +93,47 @@ assert res['i'] is False
 assert res['j'] is True
 assert res['k'] == 'string'
 assert res['l'] == 1.234
-print('PASS')
 
+
+# Testing empty object and empty array using type and len
+res = json.loads('{}')
+assert type(res) == dict
+assert len(res) == 0
+
+res = json.loads('[]')
+assert type(res) == list
+assert len(res) == 0
+
+res = json.loads('{"a": {}}')
+assert type(res['a']) == dict
+assert len(res['a']) == 0
+
+res = json.loads('{"a": []}')
+assert type(res['a']) == list
+assert len(res['a']) == 0
+
+res = json.loads('{"a": 1, "b": {}, "c": []}')
+assert res['a'] == 1
+assert type(res['b']) == dict
+assert len(res['b']) == 0
+assert type(res['c']) == list
+assert len(res['c']) == 0
+
+res = json.loads(
+    '{"a": 1, "b": 2, "c": 3, "d": {"e": 4, "f": {}}, "g": [6, {}, 8], "h": null, "i": false, "j": true, "k": "string", "l": 1.234}')
+assert res['a'] == 1
+assert res['b'] == 2
+assert res['c'] == 3
+assert res['d']['e'] == 4
+assert type(res['d']['f']) == dict
+assert len(res['d']['f']) == 0
+assert res['g'][0] == 6
+assert type(res['g'][1]) == dict
+assert len(res['g'][1]) == 0
+assert res['g'][2] == 8
+assert res['h'] is None
+assert res['i'] is False
+assert res['j'] is True
+assert res['k'] == 'string'
+assert res['l'] == 1.234
+print('PASS')

+ 2 - 10
package/json/_json.c

@@ -80,8 +80,8 @@ Arg* json_to_arg_recursive(jsmntok_t* t,
         case JSMN_OBJECT: {
             PikaObj* ret = obj_newDict(NULL);
             int num_keys = t[*index].size;
-            (*index)++;
             for (int i = 0; i < num_keys; i++) {
+                (*index)++;
                 jsmntok_t* key_tok = &t[*index];
                 char* value = json_str + key_tok->start;
                 int size = key_tok->end - key_tok->start;
@@ -94,9 +94,6 @@ Arg* json_to_arg_recursive(jsmntok_t* t,
                     json_to_arg_recursive(t, index, json_str, token_count);
                 objDict_set(ret, key, val_nested);
                 arg_deinit(val_nested);
-                if (i < num_keys - 1) {
-                    (*index)++;
-                }
             }
             val = arg_newObj(ret);
             break;
@@ -105,17 +102,12 @@ Arg* json_to_arg_recursive(jsmntok_t* t,
             PikaObj* ret = obj_newList(NULL);
             jsmntok_t* key_tok = &t[*index];
             int num_elements = key_tok->size;
-            if (num_elements > 0) {
-                (*index)++;
-            }
             for (int i = 0; i < num_elements; i++) {
+                (*index)++;
                 Arg* val_nested =
                     json_to_arg_recursive(t, index, json_str, token_count);
                 objList_append(ret, val_nested);
                 arg_deinit(val_nested);
-                if (i < num_elements - 1) {
-                    (*index)++;
-                }
             }
             val = arg_newObj(ret);
             break;

+ 2 - 10
port/linux/package/pikascript/pikascript-lib/json/_json.c

@@ -80,8 +80,8 @@ Arg* json_to_arg_recursive(jsmntok_t* t,
         case JSMN_OBJECT: {
             PikaObj* ret = obj_newDict(NULL);
             int num_keys = t[*index].size;
-            (*index)++;
             for (int i = 0; i < num_keys; i++) {
+                (*index)++;
                 jsmntok_t* key_tok = &t[*index];
                 char* value = json_str + key_tok->start;
                 int size = key_tok->end - key_tok->start;
@@ -94,9 +94,6 @@ Arg* json_to_arg_recursive(jsmntok_t* t,
                     json_to_arg_recursive(t, index, json_str, token_count);
                 objDict_set(ret, key, val_nested);
                 arg_deinit(val_nested);
-                if (i < num_keys - 1) {
-                    (*index)++;
-                }
             }
             val = arg_newObj(ret);
             break;
@@ -105,17 +102,12 @@ Arg* json_to_arg_recursive(jsmntok_t* t,
             PikaObj* ret = obj_newList(NULL);
             jsmntok_t* key_tok = &t[*index];
             int num_elements = key_tok->size;
-            if (num_elements > 0) {
-                (*index)++;
-            }
             for (int i = 0; i < num_elements; i++) {
+                (*index)++;
                 Arg* val_nested =
                     json_to_arg_recursive(t, index, json_str, token_count);
                 objList_append(ret, val_nested);
                 arg_deinit(val_nested);
-                if (i < num_elements - 1) {
-                    (*index)++;
-                }
             }
             val = arg_newObj(ret);
             break;

+ 43 - 1
test/python/json/json_loads.py

@@ -93,5 +93,47 @@ assert res['i'] is False
 assert res['j'] is True
 assert res['k'] == 'string'
 assert res['l'] == 1.234
-print('PASS')
 
+
+# Testing empty object and empty array using type and len
+res = json.loads('{}')
+assert type(res) == dict
+assert len(res) == 0
+
+res = json.loads('[]')
+assert type(res) == list
+assert len(res) == 0
+
+res = json.loads('{"a": {}}')
+assert type(res['a']) == dict
+assert len(res['a']) == 0
+
+res = json.loads('{"a": []}')
+assert type(res['a']) == list
+assert len(res['a']) == 0
+
+res = json.loads('{"a": 1, "b": {}, "c": []}')
+assert res['a'] == 1
+assert type(res['b']) == dict
+assert len(res['b']) == 0
+assert type(res['c']) == list
+assert len(res['c']) == 0
+
+res = json.loads(
+    '{"a": 1, "b": 2, "c": 3, "d": {"e": 4, "f": {}}, "g": [6, {}, 8], "h": null, "i": false, "j": true, "k": "string", "l": 1.234}')
+assert res['a'] == 1
+assert res['b'] == 2
+assert res['c'] == 3
+assert res['d']['e'] == 4
+assert type(res['d']['f']) == dict
+assert len(res['d']['f']) == 0
+assert res['g'][0] == 6
+assert type(res['g'][1]) == dict
+assert len(res['g'][1]) == 0
+assert res['g'][2] == 8
+assert res['h'] is None
+assert res['i'] is False
+assert res['j'] is True
+assert res['k'] == 'string'
+assert res['l'] == 1.234
+print('PASS')