1
0
mirror of https://github.com/json-iterator/go.git synced 2025-03-20 20:54:55 +02:00

#63 support decode anonymous struct

This commit is contained in:
Tao Wen 2017-06-19 23:02:57 +08:00
parent 50583f6bae
commit eecb062c32
3 changed files with 26 additions and 6 deletions

View File

@ -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)

View File

@ -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) {

View File

@ -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