json: fix recursive pointer encoding (#19840)

This commit is contained in:
Felipe Pena 2023-11-11 21:00:23 -03:00 committed by GitHub
parent 239430aad5
commit e1312d053a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 2 deletions

View file

@ -0,0 +1,19 @@
import json
struct PostTag {
id string
parent ?&PostTag
visibility string
created_at string [json: 'createdAt']
metadata string [raw]
}
fn test_main() {
new_post_tag := PostTag{}
assert json.encode(new_post_tag) == '{"id":"","visibility":"","createdAt":"","metadata":""}'
new_post_tag2 := PostTag{
parent: new_post_tag
}
assert json.encode(new_post_tag2) == '{"id":"","parent":{"id":"","visibility":"","createdAt":"","metadata":""},"visibility":"","createdAt":"","metadata":""}'
}

View file

@ -58,7 +58,7 @@ fn (mut g Gen) gen_jsons() {
mut init_styp := '${styp} res'
if utyp.has_flag(.option) {
if sym.kind == .struct_ {
if sym.kind == .struct_ && !utyp.is_ptr() {
init_styp += ' = '
g.set_current_pos_as_last_stmt_pos()
pos := g.out.len
@ -634,7 +634,8 @@ fn (mut g Gen) gen_struct_enc_dec(utyp ast.Type, type_info ast.TypeInfo, styp st
dec.writeln('\telse')
dec.writeln('\t\t_option_ok(&(${base_typ}[]) { tos5(cJSON_PrintUnformatted(js_get(root, "${name}"))) }, &${prefix}${op}${c_name(field.name)}, sizeof(${base_typ}));')
} else {
dec.writeln('\tres${op}${c_name(field.name)} = tos5(cJSON_PrintUnformatted(' +
dec.writeln(
'\t${prefix}${op}${c_name(field.name)} = tos5(cJSON_PrintUnformatted(' +
'js_get(root, "${name}")));')
}
} else {