diff options
Diffstat (limited to 'src/encoding/json/decode.go')
| -rw-r--r-- | src/encoding/json/decode.go | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go index 3c40eb9cef..3ca3d7803e 100644 --- a/src/encoding/json/decode.go +++ b/src/encoding/json/decode.go @@ -8,7 +8,6 @@ package json import ( - "bytes" "encoding" "encoding/base64" "fmt" @@ -691,7 +690,7 @@ func (d *decodeState) object(v reflect.Value) error { return nil } - var fields []field + var fields structFields // Check type of target: // struct or @@ -761,14 +760,18 @@ func (d *decodeState) object(v reflect.Value) error { subv = mapElem } else { var f *field - for i := range fields { - ff := &fields[i] - if bytes.Equal(ff.nameBytes, key) { - f = ff - break - } - if f == nil && ff.equalFold(ff.nameBytes, key) { - f = ff + if i, ok := fields.nameIndex[string(key)]; ok { + // Found an exact name match. + f = &fields.list[i] + } else { + // Fall back to the expensive case-insensitive + // linear search. + for i := range fields.list { + ff := &fields.list[i] + if ff.equalFold(ff.nameBytes, key) { + f = ff + break + } } } if f != nil { |
