From fc5ce30f34163ce1dfa7ad8b01e60317c8d43c01 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 21 Jul 2024 00:37:11 +0200 Subject: [PATCH] Allow json to unmarshal empty struct. --- core/encoding/json/unmarshal.odin | 3 +-- tests/core/encoding/json/test_core_json.odin | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 1c1801bcd..127bce650 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -363,8 +363,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm } v := v - v = reflect.any_base(v) - ti := type_info_of(v.id) + ti := reflect.type_info_base(type_info_of(v.id)) #partial switch t in ti.variant { case reflect.Type_Info_Struct: diff --git a/tests/core/encoding/json/test_core_json.odin b/tests/core/encoding/json/test_core_json.odin index 10e09df3b..42ac9ce0f 100644 --- a/tests/core/encoding/json/test_core_json.odin +++ b/tests/core/encoding/json/test_core_json.odin @@ -349,6 +349,24 @@ unmarshal_json :: proc(t: ^testing.T) { } } +@test +unmarshal_empty_struct :: proc(t: ^testing.T) { + TestStruct :: struct {} + test := make(map[string]TestStruct) + input: = `{ + "test_1": {}, + "test_2": {} + }` + err := json.unmarshal(transmute([]u8)input, &test) + defer { + for k in test { + delete(k) + } + delete(test) + } + testing.expect(t, err == nil, "Expected empty struct to unmarshal without error") +} + @test surrogate :: proc(t: ^testing.T) { input := `+ + * 😃 - /`