mirror of
https://github.com/golang/go
synced 2024-11-20 03:54:40 -07:00
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
This commit is contained in:
parent
dae2992c98
commit
c3c8e35af2
@ -504,10 +504,15 @@ func (d *decodeState) object(v reflect.Value) {
|
||||
}
|
||||
// First, tag match
|
||||
tagName, _ := parseTag(tag)
|
||||
if tagName == key {
|
||||
f = sf
|
||||
ok = true
|
||||
break // no better match possible
|
||||
if tagName != "" {
|
||||
if tagName == key {
|
||||
f = sf
|
||||
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
|
||||
if sf.Name == key {
|
||||
|
@ -18,6 +18,10 @@ type T struct {
|
||||
Z int `json:"-"`
|
||||
}
|
||||
|
||||
type U struct {
|
||||
Alphabet string `json:"alpha"`
|
||||
}
|
||||
|
||||
type tx struct {
|
||||
x int
|
||||
}
|
||||
@ -72,6 +76,10 @@ var unmarshalTests = []unmarshalTest{
|
||||
// Z has a "-" tag.
|
||||
{`{"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
|
||||
{`{"X": "foo", "Y"}`, nil, nil, &SyntaxError{"invalid character '}' after object key", 17}},
|
||||
{`[1, 2, 3+]`, nil, nil, &SyntaxError{"invalid character '+' after array element", 9}},
|
||||
|
Loading…
Reference in New Issue
Block a user