From ff3c624fa9af5d43b1d67c42cbee077354258510 Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Wed, 21 Jun 2017 00:26:18 +0800 Subject: [PATCH] fix anonymous fields --- extra/fuzzy_decoder.go | 6 ++--- extra/fuzzy_decoder_test.go | 4 ++-- extra/naming_strategy_test.go | 2 +- extra/private_fields_test.go | 4 ++-- extra/time_as_int64_codec.go | 3 ++- extra/time_as_int64_codec_test.go | 4 ++-- feature_config.go | 10 ++++---- feature_iter_int.go | 2 +- feature_reflect_extension.go | 11 +++++---- feature_reflect_object.go | 40 +++++++++++++++---------------- jsoniter_map_test.go | 8 +++---- jsoniter_object_test.go | 17 ++++++------- 12 files changed, 58 insertions(+), 53 deletions(-) diff --git a/extra/fuzzy_decoder.go b/extra/fuzzy_decoder.go index aa5a83c..3ea0089 100644 --- a/extra/fuzzy_decoder.go +++ b/extra/fuzzy_decoder.go @@ -1,12 +1,12 @@ package extra import ( - "github.com/json-iterator/go" - "unsafe" "encoding/json" - "strings" + "github.com/json-iterator/go" "math" "reflect" + "strings" + "unsafe" ) const MaxUint = ^uint(0) diff --git a/extra/fuzzy_decoder_test.go b/extra/fuzzy_decoder_test.go index f2b86a9..5c4801d 100644 --- a/extra/fuzzy_decoder_test.go +++ b/extra/fuzzy_decoder_test.go @@ -1,9 +1,9 @@ package extra import ( - "testing" "github.com/json-iterator/go" "github.com/json-iterator/go/require" + "testing" ) func init() { @@ -98,4 +98,4 @@ func Test_empty_array_as_object(t *testing.T) { var val struct{} should.Nil(jsoniter.UnmarshalFromString(`[]`, &val)) should.Equal(struct{}{}, val) -} \ No newline at end of file +} diff --git a/extra/naming_strategy_test.go b/extra/naming_strategy_test.go index 97ddf47..77810e3 100644 --- a/extra/naming_strategy_test.go +++ b/extra/naming_strategy_test.go @@ -1,9 +1,9 @@ package extra import ( - "testing" "github.com/json-iterator/go" "github.com/json-iterator/go/require" + "testing" ) func Test_lower_case_with_underscores(t *testing.T) { diff --git a/extra/private_fields_test.go b/extra/private_fields_test.go index eb0274f..f6a5e24 100644 --- a/extra/private_fields_test.go +++ b/extra/private_fields_test.go @@ -1,9 +1,9 @@ package extra import ( - "testing" - "github.com/json-iterator/go/require" "github.com/json-iterator/go" + "github.com/json-iterator/go/require" + "testing" ) func Test_private_fields(t *testing.T) { diff --git a/extra/time_as_int64_codec.go b/extra/time_as_int64_codec.go index 977bf49..333b7e9 100644 --- a/extra/time_as_int64_codec.go +++ b/extra/time_as_int64_codec.go @@ -2,8 +2,8 @@ package extra import ( "github.com/json-iterator/go" - "unsafe" "time" + "unsafe" ) // keep epoch milliseconds @@ -15,6 +15,7 @@ func RegisterTimeAsInt64Codec(precision time.Duration) { type timeAsInt64Codec struct { precision time.Duration } + func (codec *timeAsInt64Codec) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) { nanoseconds := iter.ReadInt64() * codec.precision.Nanoseconds() *((*time.Time)(ptr)) = time.Unix(0, nanoseconds) diff --git a/extra/time_as_int64_codec_test.go b/extra/time_as_int64_codec_test.go index a2a1e3a..dd8fe12 100644 --- a/extra/time_as_int64_codec_test.go +++ b/extra/time_as_int64_codec_test.go @@ -1,10 +1,10 @@ package extra import ( + "github.com/json-iterator/go" + "github.com/json-iterator/go/require" "testing" "time" - "github.com/json-iterator/go/require" - "github.com/json-iterator/go" ) func Test_time_as_int64(t *testing.T) { diff --git a/feature_config.go b/feature_config.go index 7504ac0..270a290 100644 --- a/feature_config.go +++ b/feature_config.go @@ -10,11 +10,11 @@ import ( ) type Config struct { - IndentionStep int - MarshalFloatWith6Digits bool - EscapeHtml bool - SortMapKeys bool - UseNumber bool + IndentionStep int + MarshalFloatWith6Digits bool + EscapeHtml bool + SortMapKeys bool + UseNumber bool } type frozenConfig struct { diff --git a/feature_iter_int.go b/feature_iter_int.go index 8e27f76..139f6f8 100644 --- a/feature_iter_int.go +++ b/feature_iter_int.go @@ -1,8 +1,8 @@ package jsoniter import ( - "strconv" "math" + "strconv" ) var intDigits []int8 diff --git a/feature_reflect_extension.go b/feature_reflect_extension.go index c0caa48..4a7a12d 100644 --- a/feature_reflect_extension.go +++ b/feature_reflect_extension.go @@ -1,11 +1,11 @@ package jsoniter import ( - "reflect" "fmt" - "unsafe" + "reflect" "strings" "unicode" + "unsafe" ) var typeDecoders = map[string]ValDecoder{} @@ -192,6 +192,7 @@ func _getTypeEncoderFromExtension(typ reflect.Type) ValEncoder { } func describeStruct(cfg *frozenConfig, typ reflect.Type) (*StructDescriptor, error) { + anonymousBindings := []*Binding{} bindings := []*Binding{} for i := 0; i < typ.NumField(); i++ { field := typ.Field(i) @@ -202,7 +203,7 @@ func describeStruct(cfg *frozenConfig, typ reflect.Type) (*StructDescriptor, err return nil, err } for _, binding := range structDescriptor.Fields { - bindings = append(bindings, binding) + anonymousBindings = append(anonymousBindings, binding) } } else if field.Type.Kind() == reflect.Ptr && field.Type.Elem().Kind() == reflect.Struct { structDescriptor, err := describeStruct(cfg, field.Type.Elem()) @@ -214,7 +215,7 @@ func describeStruct(cfg *frozenConfig, typ reflect.Type) (*StructDescriptor, err binding.Encoder = &structFieldEncoder{&field, binding.Encoder, false} binding.Decoder = &optionalDecoder{field.Type, binding.Decoder} binding.Decoder = &structFieldDecoder{&field, binding.Decoder} - bindings = append(bindings, binding) + anonymousBindings = append(anonymousBindings, binding) } } } else { @@ -272,6 +273,8 @@ func describeStruct(cfg *frozenConfig, typ reflect.Type) (*StructDescriptor, err binding.Decoder = &structFieldDecoder{binding.Field, binding.Decoder} binding.Encoder = &structFieldEncoder{binding.Field, binding.Encoder, shouldOmitEmpty} } + // insert anonymous bindings to the head + structDescriptor.Fields = append(anonymousBindings, structDescriptor.Fields...) return structDescriptor, nil } diff --git a/feature_reflect_object.go b/feature_reflect_object.go index ebb8228..d0b7191 100644 --- a/feature_reflect_object.go +++ b/feature_reflect_object.go @@ -105,7 +105,7 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &threeFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil case 4: var fieldName1 int32 var fieldName2 int32 @@ -138,8 +138,8 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &fourFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4}, nil + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4}, nil case 5: var fieldName1 int32 var fieldName2 int32 @@ -177,8 +177,8 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &fiveFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, fieldName5, fieldDecoder5}, nil + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, fieldName5, fieldDecoder5}, nil case 6: var fieldName1 int32 var fieldName2 int32 @@ -221,8 +221,8 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &sixFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6}, nil + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6}, nil case 7: var fieldName1 int32 var fieldName2 int32 @@ -270,9 +270,9 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &sevenFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7}, nil + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7}, nil case 8: var fieldName1 int32 var fieldName2 int32 @@ -325,9 +325,9 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &eightFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, fieldName8, fieldDecoder8}, nil + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7, fieldName8, fieldDecoder8}, nil case 9: var fieldName1 int32 var fieldName2 int32 @@ -385,9 +385,9 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &nineFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9}, nil + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9}, nil case 10: var fieldName1 int32 var fieldName2 int32 @@ -450,10 +450,10 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &tenFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9, - fieldName10, fieldDecoder10}, nil + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9, + fieldName10, fieldDecoder10}, nil } return &generalStructDecoder{typ, fields}, nil } diff --git a/jsoniter_map_test.go b/jsoniter_map_test.go index 31ffccf..794bcb1 100644 --- a/jsoniter_map_test.go +++ b/jsoniter_map_test.go @@ -68,11 +68,11 @@ func Test_decode_int_key_map(t *testing.T) { func Test_encode_TextMarshaler_key_map(t *testing.T) { should := require.New(t) -f, _, _ := big.ParseFloat("1", 10, 64, big.ToZero) -val := map[*big.Float]string{f: "2"} -str, err := MarshalToString(val) + f, _, _ := big.ParseFloat("1", 10, 64, big.ToZero) + val := map[*big.Float]string{f: "2"} + str, err := MarshalToString(val) should.Nil(err) -should.Equal(`{"1":"2"}`, str) + should.Equal(`{"1":"2"}`, str) } func Test_decode_TextMarshaler_key_map(t *testing.T) { diff --git a/jsoniter_object_test.go b/jsoniter_object_test.go index 69dc460..036416b 100644 --- a/jsoniter_object_test.go +++ b/jsoniter_object_test.go @@ -208,9 +208,9 @@ func Test_decode_struct_field_with_tag(t *testing.T) { func Test_decode_struct_field_with_tag_string(t *testing.T) { should := require.New(t) -type TestObject struct { - Field1 int `json:",string"` -} + type TestObject struct { + Field1 int `json:",string"` + } obj := TestObject{Field1: 100} should.Nil(UnmarshalFromString(`{"Field1": "100"}`, &obj)) should.Equal(100, obj.Field1) @@ -346,8 +346,10 @@ func Test_multiple_level_anonymous_struct(t *testing.T) { Field3 string } should := require.New(t) - output, err := MarshalToString(Level3{Level2{Level1{"1"}, "2"}, "3"}) + obj := Level3{Level2{Level1{"1"}, "2"}, "3"} + output, err := MarshalToString(obj) should.Nil(err) + fmt.Println(output) should.Contains(output, `"Field1":"1"`) should.Contains(output, `"Field2":"2"`) should.Contains(output, `"Field3":"3"`) @@ -369,7 +371,8 @@ func Test_multiple_level_anonymous_struct_with_ptr(t *testing.T) { Field3 string } should := require.New(t) - output, err := MarshalToString(Level3{&Level2{&Level1{"1", "", "4"}, "2", ""}, "3"}) + obj := Level3{&Level2{&Level1{"1", "", "4"}, "2", ""}, "3"} + output, err := MarshalToString(obj) should.Nil(err) should.Contains(output, `"Field1":"1"`) should.Contains(output, `"Field2":"2"`) @@ -377,8 +380,6 @@ func Test_multiple_level_anonymous_struct_with_ptr(t *testing.T) { should.Contains(output, `"Field4":"4"`) } - - func Test_shadow_struct_field(t *testing.T) { should := require.New(t) type omit *struct{} @@ -393,7 +394,7 @@ func Test_shadow_struct_field(t *testing.T) { OmitMaxAge omit `json:"cacheAge,omitempty"` // Add nice keys - MaxAge int `json:"max_age"` + MaxAge int `json:"max_age"` }{ CacheItem: &CacheItem{ Key: "value",