From 1c40b6fd4a0a9d04ebf516b3d3fb61819fc22461 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Thu, 26 Feb 2026 19:45:07 +0300 Subject: [PATCH] json2: fix alias type of json2.Any can't decode json used as generic (fixes #24127) --- vlib/x/json2/decode_sumtype.v | 12 ++++++++- vlib/x/json2/tests/decode_any_alias_test.v | 29 ++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 vlib/x/json2/tests/decode_any_alias_test.v diff --git a/vlib/x/json2/decode_sumtype.v b/vlib/x/json2/decode_sumtype.v index 3533b2af3..fd624e333 100644 --- a/vlib/x/json2/decode_sumtype.v +++ b/vlib/x/json2/decode_sumtype.v @@ -329,7 +329,17 @@ fn (mut decoder Decoder) init_sumtype_by_value_kind[T](mut val T, value_info Val fn (mut decoder Decoder) decode_sumtype[T](mut val T) ! { $if T is $alias { - decoder.decode_error('Type aliased sumtypes not supported.')! + $if T.unaliased_typ is Any { + mut unaliased_val := Any{} + value_info := decoder.current_node.value + + decoder.init_sumtype_by_value_kind(mut unaliased_val, value_info)! + + unaliased_val = decoder.get_decoded_sumtype_workaround(unaliased_val)! + val = T(unaliased_val) + } $else { + decoder.decode_error('Type aliased sumtypes not supported.')! + } } $else { value_info := decoder.current_node.value diff --git a/vlib/x/json2/tests/decode_any_alias_test.v b/vlib/x/json2/tests/decode_any_alias_test.v new file mode 100644 index 000000000..3301bce40 --- /dev/null +++ b/vlib/x/json2/tests/decode_any_alias_test.v @@ -0,0 +1,29 @@ +import x.json2 as json + +type Issue24127Any = json.Any +type Issue24127Map = map[string]Issue24127Any + +const issue_24127_json_inputs = [ + '{}', + '{"a":"b"}', + '{"a":1}', + '{"a":3.14}', + '{"a":{"b":"c"}}', + '{"a":true}', +] + +fn test_decode_alias_of_any_sumtype() { + for input in issue_24127_json_inputs { + direct := json.decode[json.Any](input)! + aliased := json.decode[Issue24127Any](input)! + assert json.encode(direct) == json.encode(aliased) + } +} + +fn test_decode_map_with_any_alias_value() { + for input in issue_24127_json_inputs { + direct := json.decode[map[string]json.Any](input)! + aliased := json.decode[Issue24127Map](input)! + assert json.encode(direct) == json.encode(aliased) + } +} -- 2.39.5