From 2d6d6c9ac9f400d8565b4d2e1878b58d670f8510 Mon Sep 17 00:00:00 2001 From: yuyi Date: Thu, 14 Apr 2022 20:36:24 +0800 Subject: [PATCH] json: fix json decode with sumtype of multi array type (#14035) --- vlib/json/json_decode_with_sumtype_test.v | 16 ++++++++++++---- vlib/v/gen/c/json.v | 15 +++++++++++---- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/vlib/json/json_decode_with_sumtype_test.v b/vlib/json/json_decode_with_sumtype_test.v index 5fbc81573f..4bf76bcead 100644 --- a/vlib/json/json_decode_with_sumtype_test.v +++ b/vlib/json/json_decode_with_sumtype_test.v @@ -1,13 +1,21 @@ import json -type Test = []string | string +type Test = []bool | []int | []string | string struct Some { t Test } fn test_json_decode_with_sumtype() ? { - v := json.decode(Some, '{"t": ["string", "string2"]}') ? - println(v) - assert '$v.t' == "Test(['string', 'string2'])" + v1 := json.decode(Some, '{"t": ["string", "string2"]}') ? + println(v1) + assert v1.t == Test(['string', 'string2']) + + v2 := json.decode(Some, '{"t": [11, 22]}') ? + println(v2) + assert v2.t == Test([11, 22]) + + v3 := json.decode(Some, '{"t": [true, false]}') ? + println(v3) + assert v3.t == Test([true, false]) } diff --git a/vlib/v/gen/c/json.v b/vlib/v/gen/c/json.v index d939fdc595..75f5354191 100644 --- a/vlib/v/gen/c/json.v +++ b/vlib/v/gen/c/json.v @@ -311,14 +311,21 @@ fn (mut g Gen) gen_sumtype_enc_dec(sym ast.TypeSymbol, mut enc strings.Builder, dec.writeln('\t\t}') } - if var_t == 'Array_string' { + if var_t.starts_with('Array_') { tmp := g.new_tmp_var() - dec.writeln('\t\tif (cJSON_IsArray(root)) {') - dec.writeln('\t\t\tOption_Array_string $tmp = ${js_dec_name(var_t)}(root);') + judge_elem_typ := if var_t.ends_with('string') { + 'cJSON_IsString(root->child)' + } else if var_t.ends_with('bool') { + 'cJSON_IsBool(root->child)' + } else { + 'cJSON_IsNumber(root->child)' + } + dec.writeln('\t\tif (cJSON_IsArray(root) && $judge_elem_typ) {') + dec.writeln('\t\t\tOption_$var_t $tmp = ${js_dec_name(var_t)}(root);') dec.writeln('\t\t\tif (${tmp}.state != 0) {') dec.writeln('\t\t\t\treturn (Option_$sym.cname){ .state = ${tmp}.state, .err = ${tmp}.err, .data = {0} };') dec.writeln('\t\t\t}') - dec.writeln('\t\t\tres = Array_string_to_sumtype_${sym.cname}(($var_t*)${tmp}.data);') + dec.writeln('\t\t\tres = ${var_t}_to_sumtype_${sym.cname}(($var_t*)${tmp}.data);') dec.writeln('\t\t}') }