From a92111261c19c217bf69c4183726d25f9fe26906 Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Fri, 5 May 2017 17:27:41 +0800 Subject: [PATCH] fix struct with one pointer field --- feature_reflect_object.go | 4 ++++ jsoniter_reflect_struct_test.go | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/feature_reflect_object.go b/feature_reflect_object.go index 69458cd..1b59984 100644 --- a/feature_reflect_object.go +++ b/feature_reflect_object.go @@ -51,6 +51,10 @@ func encoderOfStruct(typ reflect.Type) (Encoder, error) { if field.Type.Kind() == reflect.Map && typ.NumField() > 1 { encoder = &optionalEncoder{encoder} } + // one field pointer field will be inlined + if field.Type.Kind() == reflect.Ptr && typ.NumField() == 1 { + encoder = (encoder.(*optionalEncoder)).valueEncoder + } } for _, fieldName := range fieldNames { structEncoder_.fields = append(structEncoder_.fields, diff --git a/jsoniter_reflect_struct_test.go b/jsoniter_reflect_struct_test.go index f28519b..ec14f68 100644 --- a/jsoniter_reflect_struct_test.go +++ b/jsoniter_reflect_struct_test.go @@ -200,3 +200,18 @@ func Test_recursive_struct(t *testing.T) { err = UnmarshalFromString(str, &obj) should.Nil(err) } + +func Test_one_field_struct(t *testing.T) { + should := require.New(t) + type AnotherObject struct { + } + type TestObject struct { + Me *AnotherObject + } + obj := TestObject{} + str, err := MarshalToString(obj) + should.Nil(err) + should.Equal(`{"Me":{}}`, str) + err = UnmarshalFromString(str, &obj) + should.Nil(err) +} \ No newline at end of file