aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/json/decode.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/encoding/json/decode.go')
-rw-r--r--src/encoding/json/decode.go23
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 {