You've already forked json-iterator
mirror of
https://github.com/json-iterator/go.git
synced 2025-06-15 22:50:24 +02:00
#36 handle anonymous
This commit is contained in:
@ -11,12 +11,12 @@ import (
|
|||||||
|
|
||||||
func encoderOfStruct(typ reflect.Type) (Encoder, error) {
|
func encoderOfStruct(typ reflect.Type) (Encoder, error) {
|
||||||
structEncoder_ := &structEncoder{}
|
structEncoder_ := &structEncoder{}
|
||||||
for i := 0; i < typ.NumField(); i++ {
|
fields := map[string]*structFieldEncoder{}
|
||||||
field := typ.Field(i)
|
for _, field := range listStructFields(typ) {
|
||||||
fieldEncoderKey := fmt.Sprintf("%s/%s", typ.String(), field.Name)
|
fieldEncoderKey := fmt.Sprintf("%s/%s", typ.String(), field.Name)
|
||||||
var extensionProvidedFieldNames []string
|
var extensionProvidedFieldNames []string
|
||||||
for _, extension := range extensions {
|
for _, extension := range extensions {
|
||||||
alternativeFieldNames, fun, _ := extension(typ, &field)
|
alternativeFieldNames, fun, _ := extension(typ, field)
|
||||||
if alternativeFieldNames != nil {
|
if alternativeFieldNames != nil {
|
||||||
extensionProvidedFieldNames = alternativeFieldNames
|
extensionProvidedFieldNames = alternativeFieldNames
|
||||||
}
|
}
|
||||||
@ -46,16 +46,31 @@ func encoderOfStruct(typ reflect.Type) (Encoder, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, fieldName := range fieldNames {
|
for _, fieldName := range fieldNames {
|
||||||
structEncoder_.fields = append(structEncoder_.fields,
|
fields[fieldName] = &structFieldEncoder{field, fieldName, encoder, omitempty}
|
||||||
&structFieldEncoder{&field, fieldName, encoder, omitempty})
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if len(structEncoder_.fields) == 0 {
|
if len(fields) == 0 {
|
||||||
return &emptyStructEncoder{}, nil
|
return &emptyStructEncoder{}, nil
|
||||||
}
|
}
|
||||||
|
for _, field := range fields {
|
||||||
|
structEncoder_.fields = append(structEncoder_.fields, field)
|
||||||
|
}
|
||||||
return structEncoder_, nil
|
return structEncoder_, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func listStructFields(typ reflect.Type) []*reflect.StructField {
|
||||||
|
fields := []*reflect.StructField{}
|
||||||
|
for i := 0; i < typ.NumField(); i++ {
|
||||||
|
field := typ.Field(i)
|
||||||
|
if field.Anonymous {
|
||||||
|
fields = append(fields, listStructFields(field.Type)...)
|
||||||
|
} else {
|
||||||
|
fields = append(fields, &field)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fields
|
||||||
|
}
|
||||||
|
|
||||||
func decoderOfStruct(typ reflect.Type) (Decoder, error) {
|
func decoderOfStruct(typ reflect.Type) (Decoder, error) {
|
||||||
fields := map[string]*structFieldDecoder{}
|
fields := map[string]*structFieldDecoder{}
|
||||||
for i := 0; i < typ.NumField(); i++ {
|
for i := 0; i < typ.NumField(); i++ {
|
||||||
|
@ -21,4 +21,4 @@ func Test_iterator_api_demo(t *testing.T) {
|
|||||||
total += iter.ReadInt()
|
total += iter.ReadInt()
|
||||||
}
|
}
|
||||||
fmt.Println(total)
|
fmt.Println(total)
|
||||||
}
|
}
|
||||||
|
@ -223,3 +223,18 @@ func Test_one_field_struct(t *testing.T) {
|
|||||||
should.Nil(err)
|
should.Nil(err)
|
||||||
should.Equal(`{"Me":{"Field":{"Field":{"Field":"abc"}}}}`, str)
|
should.Equal(`{"Me":{"Field":{"Field":{"Field":"abc"}}}}`, str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_anonymous_struct_marshal(t *testing.T) {
|
||||||
|
should := require.New(t)
|
||||||
|
type TestObject struct {
|
||||||
|
Field string
|
||||||
|
}
|
||||||
|
str, err := MarshalToString(struct{
|
||||||
|
TestObject
|
||||||
|
Field int
|
||||||
|
}{
|
||||||
|
Field: 100,
|
||||||
|
})
|
||||||
|
should.Nil(err)
|
||||||
|
should.Equal(`{"Field":100}`, str)
|
||||||
|
}
|
Reference in New Issue
Block a user