json: fix decoding of null map/array (#7936)

pull/7952/head
yuyi 2021-01-08 03:21:22 +08:00 committed by GitHub
parent 6c013023fc
commit 2ad2d68d7c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 2 deletions

View File

@ -366,3 +366,16 @@ fn test_list_no_items() {
assert list.id == 1
assert list.items == []
}
struct Info {
id int
items []string
maps map[string]string
}
fn test_decode_null_object() {
info := json.decode(Info, '{"id": 22, "items": null, "maps": null}') or { panic(err) }
assert info.id == 22
assert '$info.items' == '[]'
assert '$info.maps' == '{}'
}

View File

@ -222,7 +222,7 @@ fn (mut g Gen) decode_array(value_type table.Type) string {
'
}
return '
if(root && !cJSON_IsArray(root)) {
if(root && !cJSON_IsArray(root) && !cJSON_IsNull(root)) {
Option err = v_error( string_add(_SLIT("Json element is not an array: "), tos2(cJSON_PrintUnformatted(root))) );
return *(Option_array_$styp *)&err;
}
@ -267,7 +267,7 @@ fn (mut g Gen) decode_map(key_type table.Type, value_type table.Type) string {
'
}
return '
if(!cJSON_IsObject(root)) {
if(!cJSON_IsObject(root) && !cJSON_IsNull(root)) {
Option err = v_error( string_add(_SLIT("Json element is not an object: "), tos2(cJSON_PrintUnformatted(root))) );
return *(Option_map_${styp}_$styp_v *)&err;
}