diff --git a/feature_reflect_object.go b/feature_reflect_object.go index 8a2c94e..1d4bf73 100644 --- a/feature_reflect_object.go +++ b/feature_reflect_object.go @@ -88,12 +88,11 @@ func listStructFields(typ reflect.Type) []*reflect.StructField { func decoderOfStruct(cfg *frozenConfig, typ reflect.Type) (Decoder, error) { fields := map[string]*structFieldDecoder{} - for i := 0; i < typ.NumField(); i++ { - field := typ.Field(i) + for _, field := range listStructFields(typ) { fieldDecoderKey := fmt.Sprintf("%s/%s", typ.String(), field.Name) var extensionProviedFieldNames []string for _, extension := range extensions { - alternativeFieldNames, _, fun := extension(typ, &field) + alternativeFieldNames, _, fun := extension(typ, field) if alternativeFieldNames != nil { extensionProviedFieldNames = alternativeFieldNames } @@ -102,7 +101,7 @@ func decoderOfStruct(cfg *frozenConfig, typ reflect.Type) (Decoder, error) { } } for _, extension := range cfg.extensions { - alternativeFieldNames, _, fun := extension(typ, &field) + alternativeFieldNames, _, fun := extension(typ, field) if alternativeFieldNames != nil { extensionProviedFieldNames = alternativeFieldNames } @@ -126,7 +125,7 @@ func decoderOfStruct(cfg *frozenConfig, typ reflect.Type) (Decoder, error) { } } for _, fieldName := range fieldNames { - fields[fieldName] = &structFieldDecoder{&field, decoder} + fields[fieldName] = &structFieldDecoder{field, decoder} } } return createStructDecoder(typ, fields) diff --git a/jsoniter_map_test.go b/jsoniter_map_test.go index f05191f..77a8e1c 100644 --- a/jsoniter_map_test.go +++ b/jsoniter_map_test.go @@ -128,6 +128,12 @@ func Test_decode_map_of_raw_message(t *testing.T) { var rawMap RawMap should.Nil(Unmarshal(b, &rawMap)) should.Equal(`[{"key":"value"}]`, string(*rawMap["test"])) + type Inner struct { + Key string `json:"key"` + } + var inner []Inner + Unmarshal(*rawMap["test"], &inner) + should.Equal("value", inner[0].Key) } func Test_encode_map_of_raw_message(t *testing.T) { diff --git a/jsoniter_object_test.go b/jsoniter_object_test.go index 0774bc8..26e7ff3 100644 --- a/jsoniter_object_test.go +++ b/jsoniter_object_test.go @@ -293,7 +293,7 @@ func Test_one_field_struct(t *testing.T) { should.Equal(`{"Me":{"Field":{"Field":{"Field":"abc"}}}}`, str) } -func Test_anonymous_struct_marshal(t *testing.T) { +func Test_encode_anonymous_struct(t *testing.T) { should := require.New(t) type TestObject struct { Field string @@ -308,6 +308,21 @@ func Test_anonymous_struct_marshal(t *testing.T) { should.Equal(`{"Field":100}`, str) } +func Test_decode_anonymous_struct(t *testing.T) { + should := require.New(t) + type Inner struct { + Key string `json:"key"` + } + + type Outer struct { + Inner + } + var outer Outer + j := []byte("{\"key\":\"value\"}") + should.Nil(Unmarshal(j, &outer)) + should.Equal("value", outer.Key) +} + func Test_decode_nested(t *testing.T) { type StructOfString struct { Field1 string