Commit a30dd9ce authored by Marcel van Lohuizen's avatar Marcel van Lohuizen

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/14011Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
parent 3d198bd7
...@@ -118,6 +118,7 @@ type Top struct { ...@@ -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 { ...@@ -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{ ...@@ -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{ ...@@ -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) { ...@@ -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 { ...@@ -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")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment