ソースを参照

#63 support decode anonymous struct

Tao Wen 8 年 前
コミット
eecb062c32
3 ファイル変更26 行追加6 行削除
  1. 4 5
      feature_reflect_object.go
  2. 6 0
      jsoniter_map_test.go
  3. 16 1
      jsoniter_object_test.go

+ 4 - 5
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)

+ 6 - 0
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) {

+ 16 - 1
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