Commit c3c8e35a authored by David Symonds's avatar David Symonds

encoding/json: don't match field name if a JSON struct tag is present.

Fixes #3566.

R=rsc
CC=golang-dev
https://golang.org/cl/6139048
parent dae2992c
...@@ -504,10 +504,15 @@ func (d *decodeState) object(v reflect.Value) { ...@@ -504,10 +504,15 @@ func (d *decodeState) object(v reflect.Value) {
} }
// First, tag match // First, tag match
tagName, _ := parseTag(tag) tagName, _ := parseTag(tag)
if tagName == key { if tagName != "" {
f = sf if tagName == key {
ok = true f = sf
break // no better match possible ok = true
break // no better match possible
}
// There was a tag, but it didn't match.
// Ignore field names.
continue
} }
// Second, exact field name match // Second, exact field name match
if sf.Name == key { if sf.Name == key {
......
...@@ -18,6 +18,10 @@ type T struct { ...@@ -18,6 +18,10 @@ type T struct {
Z int `json:"-"` Z int `json:"-"`
} }
type U struct {
Alphabet string `json:"alpha"`
}
type tx struct { type tx struct {
x int x int
} }
...@@ -72,6 +76,10 @@ var unmarshalTests = []unmarshalTest{ ...@@ -72,6 +76,10 @@ var unmarshalTests = []unmarshalTest{
// Z has a "-" tag. // Z has a "-" tag.
{`{"Y": 1, "Z": 2}`, new(T), T{Y: 1}, nil}, {`{"Y": 1, "Z": 2}`, new(T), T{Y: 1}, nil},
{`{"alpha": "abc", "alphabet": "xyz"}`, new(U), U{Alphabet: "abc"}, nil},
{`{"alpha": "abc"}`, new(U), U{Alphabet: "abc"}, nil},
{`{"alphabet": "xyz"}`, new(U), U{}, nil},
// syntax errors // syntax errors
{`{"X": "foo", "Y"}`, nil, nil, &SyntaxError{"invalid character '}' after object key", 17}}, {`{"X": "foo", "Y"}`, nil, nil, &SyntaxError{"invalid character '}' after object key", 17}},
{`[1, 2, 3+]`, nil, nil, &SyntaxError{"invalid character '+' after array element", 9}}, {`[1, 2, 3+]`, nil, nil, &SyntaxError{"invalid character '+' after array element", 9}},
......
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