diff --git a/api_tests/config_test.go b/api_tests/config_test.go index 7aa349b..2179e7c 100644 --- a/api_tests/config_test.go +++ b/api_tests/config_test.go @@ -172,3 +172,58 @@ func Test_CaseSensitive_MoreThanTenFields(t *testing.T) { should.Equal(tc.expectedOutput, output) } } + +type onlyTaggedFieldStruct struct { + A string `json:"a"` + B string + FSimpl F `json:"f_simpl"` + ISimpl I + FPtr *F `json:"f_ptr"` + IPtr *I + F + *I +} + +type F struct { + G string `json:"g"` + H string +} + +type I struct { + J string `json:"j"` + K string +} + +func Test_OnlyTaggedField(t *testing.T) { + should := require.New(t) + + obj := onlyTaggedFieldStruct{ + A: "a", + B: "b", + FSimpl: F{G: "g", H: "h"}, + ISimpl: I{J: "j", K: "k"}, + FPtr: &F{G: "g", H: "h"}, + IPtr: &I{J: "j", K: "k"}, + F: F{G: "g", H: "h"}, + I: &I{J: "j", K: "k"}, + } + + output, err := jsoniter.Config{OnlyTaggedField: true}.Froze().Marshal(obj) + should.Nil(err) + + m := make(map[string]interface{}) + err = jsoniter.Unmarshal(output, &m) + should.Nil(err) + + should.Equal(map[string]interface{}{ + "a": "a", + "f_simpl": map[string]interface{}{ + "g": "g", + }, + "f_ptr": map[string]interface{}{ + "g": "g", + }, + "g": "g", + "j": "j", + }, m) +} diff --git a/reflect_extension.go b/reflect_extension.go index 04f6875..05e8fbf 100644 --- a/reflect_extension.go +++ b/reflect_extension.go @@ -338,7 +338,7 @@ func describeStruct(ctx *ctx, typ reflect2.Type) *StructDescriptor { for i := 0; i < structType.NumField(); i++ { field := structType.Field(i) tag, hastag := field.Tag().Lookup(ctx.getTagKey()) - if ctx.onlyTaggedField && !hastag { + if ctx.onlyTaggedField && !hastag && !field.Anonymous() { continue } tagParts := strings.Split(tag, ",")