mirror of
https://github.com/golang/go
synced 2024-11-18 09:04:49 -07:00
encoding/json: check for exported fields in embedded structs
Addresses issue #12367. Must be checked in before CL 14010. Change-Id: I7233c3a62d4f55d0ac7e8a87df5fc4ee7beb7207 Reviewed-on: https://go-review.googlesource.com/14011 Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
3d198bd7be
commit
a30dd9ceeb
@ -118,6 +118,7 @@ type Top struct {
|
|||||||
Loop
|
Loop
|
||||||
Embed0p // has Point with X, Y, used
|
Embed0p // has Point with X, Y, used
|
||||||
Embed0q // has Point with Z, used
|
Embed0q // has Point with Z, used
|
||||||
|
embed // contains exported field
|
||||||
}
|
}
|
||||||
|
|
||||||
type Embed0 struct {
|
type Embed0 struct {
|
||||||
@ -148,6 +149,10 @@ type Embed0q struct {
|
|||||||
Point
|
Point
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type embed struct {
|
||||||
|
Q int
|
||||||
|
}
|
||||||
|
|
||||||
type Loop struct {
|
type Loop struct {
|
||||||
Loop1 int `json:",omitempty"`
|
Loop1 int `json:",omitempty"`
|
||||||
Loop2 int `json:",omitempty"`
|
Loop2 int `json:",omitempty"`
|
||||||
@ -331,7 +336,8 @@ var unmarshalTests = []unmarshalTest{
|
|||||||
"Loop2": 14,
|
"Loop2": 14,
|
||||||
"X": 15,
|
"X": 15,
|
||||||
"Y": 16,
|
"Y": 16,
|
||||||
"Z": 17
|
"Z": 17,
|
||||||
|
"Q": 18
|
||||||
}`,
|
}`,
|
||||||
ptr: new(Top),
|
ptr: new(Top),
|
||||||
out: Top{
|
out: Top{
|
||||||
@ -361,6 +367,9 @@ var unmarshalTests = []unmarshalTest{
|
|||||||
Embed0q: Embed0q{
|
Embed0q: Embed0q{
|
||||||
Point: Point{Z: 17},
|
Point: Point{Z: 17},
|
||||||
},
|
},
|
||||||
|
embed: embed{
|
||||||
|
Q: 18,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -507,12 +516,15 @@ func TestMarshalEmbeds(t *testing.T) {
|
|||||||
Embed0q: Embed0q{
|
Embed0q: Embed0q{
|
||||||
Point: Point{Z: 17},
|
Point: Point{Z: 17},
|
||||||
},
|
},
|
||||||
|
embed: embed{
|
||||||
|
Q: 18,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
b, err := Marshal(top)
|
b, err := Marshal(top)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
want := "{\"Level0\":1,\"Level1b\":2,\"Level1c\":3,\"Level1a\":5,\"LEVEL1B\":6,\"e\":{\"Level1a\":8,\"Level1b\":9,\"Level1c\":10,\"Level1d\":11,\"x\":12},\"Loop1\":13,\"Loop2\":14,\"X\":15,\"Y\":16,\"Z\":17}"
|
want := "{\"Level0\":1,\"Level1b\":2,\"Level1c\":3,\"Level1a\":5,\"LEVEL1B\":6,\"e\":{\"Level1a\":8,\"Level1b\":9,\"Level1c\":10,\"Level1d\":11,\"x\":12},\"Loop1\":13,\"Loop2\":14,\"X\":15,\"Y\":16,\"Z\":17,\"Q\":18}"
|
||||||
if string(b) != want {
|
if string(b) != want {
|
||||||
t.Errorf("Wrong marshal result.\n got: %q\nwant: %q", b, want)
|
t.Errorf("Wrong marshal result.\n got: %q\nwant: %q", b, want)
|
||||||
}
|
}
|
||||||
|
@ -1021,7 +1021,7 @@ func typeFields(t reflect.Type) []field {
|
|||||||
// Scan f.typ for fields to include.
|
// Scan f.typ for fields to include.
|
||||||
for i := 0; i < f.typ.NumField(); i++ {
|
for i := 0; i < f.typ.NumField(); i++ {
|
||||||
sf := f.typ.Field(i)
|
sf := f.typ.Field(i)
|
||||||
if sf.PkgPath != "" { // unexported
|
if sf.PkgPath != "" && !sf.Anonymous { // unexported
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
tag := sf.Tag.Get("json")
|
tag := sf.Tag.Get("json")
|
||||||
|
Loading…
Reference in New Issue
Block a user