diff --git a/vlib/json/json_encode_recursive_ptr_test.v b/vlib/json/json_encode_recursive_ptr_test.v new file mode 100644 index 0000000000..550471edc1 --- /dev/null +++ b/vlib/json/json_encode_recursive_ptr_test.v @@ -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":""}' +} diff --git a/vlib/v/gen/c/json.v b/vlib/v/gen/c/json.v index cdaa568cb0..00cffac6ac 100644 --- a/vlib/v/gen/c/json.v +++ b/vlib/v/gen/c/json.v @@ -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 {