diff --git a/vlib/json/json_embed_test.v b/vlib/json/json_embed_test.v new file mode 100644 index 00000000000000..7ac5b94b7b2937 --- /dev/null +++ b/vlib/json/json_embed_test.v @@ -0,0 +1,31 @@ +import json + +struct Json3 { + embed f64 +} + +struct Json2 { + Json3 + inner []f64 +} + +struct Json { + Json2 + test f64 +} + +fn test_main() { + str := '{"inner": [1, 2, 3, 4, 5],"test": 1.0, "embed": 2.0}' + data := json.decode(Json, str) or { + eprintln('Failed to decode json, error: ${err}') + return + } + println(data) + assert data.inner.len == 5 + assert data.inner[0] == 1.0 + assert data.inner[4] == 5.0 + assert data.test == 1.0 + assert data.embed == 2.0 + + assert dump(json.encode(data)) == '{"embed":2,"inner":[1,2,3,4,5],"test":1}' +} diff --git a/vlib/v/gen/c/json.v b/vlib/v/gen/c/json.v index a706a7faea3ce4..af842ecb9c6b1f 100644 --- a/vlib/v/gen/c/json.v +++ b/vlib/v/gen/c/json.v @@ -767,8 +767,13 @@ fn (mut g Gen) gen_struct_enc_dec(utyp ast.Type, type_info ast.TypeInfo, styp st if name.len > 0 && name[0].is_capital() && field_sym.info is ast.Struct { for embed in info.embeds { if embed == int(field.typ) { + prefix_embed := if embed_prefix != '' { + '${embed_prefix}.${name}' + } else { + name + } g.gen_struct_enc_dec(field.typ, g.table.sym(field.typ).info, - styp, mut enc, mut dec, name) + styp, mut enc, mut dec, prefix_embed) skip_embed = true break }