From aaf21a2f9167f9239b0c4342c0cca3727d508a25 Mon Sep 17 00:00:00 2001 From: Sydonian <794346190@qq.com> Date: Fri, 17 Jan 2025 16:36:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E9=87=8A=E6=8F=90?= =?UTF-8?q?=E7=A4=BAjson=E5=BA=93=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/serder/serder_test.go | 16 ++++++++++++++++ utils/serder/union_handler.go | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/utils/serder/serder_test.go b/utils/serder/serder_test.go index 4914531..bdb3101 100644 --- a/utils/serder/serder_test.go +++ b/utils/serder/serder_test.go @@ -648,4 +648,20 @@ func Test_ObjectToJSON2(t *testing.T) { So(err, ShouldBeNil) So(ret, ShouldResemble, val) }) + +} + +func Test_ObjectToJSON3(t *testing.T) { + Convey("反序列化TypeUnion时,JSON中对应字段类型不对", t, func() { + type Base interface{} + + union := types.NewTypeUnion[Base](&St1{}, &St2{}) + UseTypeUnionInternallyTagged(&union, "Type") + + v, err := JSONToObjectEx[[]Base]([]byte("[{\"Type\":\"St2\", \"Val\":[]}]")) + t.Logf("err: %v", err) + t.Logf("v: %+v", v[0]) + So(err, ShouldNotBeNil) + // So(ret, ShouldResemble, val) + }) } diff --git a/utils/serder/union_handler.go b/utils/serder/union_handler.go index ce4ac3e..cd98a02 100644 --- a/utils/serder/union_handler.go +++ b/utils/serder/union_handler.go @@ -254,7 +254,7 @@ func (e *InternallyTaggedDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iter // 否则New出来的是会是**T,这将导致后续的反序列化出问题 if typ.Kind() == reflect.Pointer { val := reflect.New(typ.Elem()) - raw.ToVal(val.Interface()) + raw.ToVal(val.Interface()) // TODO 使用的库丢失了ToVal期间的错误信息,考虑换个库 retVal := reflect.NewAt(e.union.Union.UnionType, ptr) retVal.Elem().Set(val)