|
|
@@ -2,10 +2,11 @@ package jsoniter
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
- "github.com/modern-go/reflect2"
|
|
|
"io"
|
|
|
"strings"
|
|
|
"unsafe"
|
|
|
+
|
|
|
+ "github.com/modern-go/reflect2"
|
|
|
)
|
|
|
|
|
|
func decoderOfStruct(ctx *ctx, typ reflect2.Type) ValDecoder {
|
|
|
@@ -31,11 +32,15 @@ func decoderOfStruct(ctx *ctx, typ reflect2.Type) ValDecoder {
|
|
|
for k, binding := range bindings {
|
|
|
fields[k] = binding.Decoder.(*structFieldDecoder)
|
|
|
}
|
|
|
- for k, binding := range bindings {
|
|
|
- if _, found := fields[strings.ToLower(k)]; !found {
|
|
|
- fields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder)
|
|
|
+
|
|
|
+ if !ctx.caseSensitive() {
|
|
|
+ for k, binding := range bindings {
|
|
|
+ if _, found := fields[strings.ToLower(k)]; !found {
|
|
|
+ fields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
return createStructDecoder(ctx, typ, fields)
|
|
|
}
|
|
|
|
|
|
@@ -46,12 +51,13 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
|
|
|
knownHash := map[int64]struct{}{
|
|
|
0: {},
|
|
|
}
|
|
|
+
|
|
|
switch len(fields) {
|
|
|
case 0:
|
|
|
return &skipObjectDecoder{typ}
|
|
|
case 1:
|
|
|
for fieldName, fieldDecoder := range fields {
|
|
|
- fieldHash := calcHash(fieldName)
|
|
|
+ fieldHash := calcHash(fieldName, ctx.caseSensitive())
|
|
|
_, known := knownHash[fieldHash]
|
|
|
if known {
|
|
|
return &generalStructDecoder{typ, fields, false}
|
|
|
@@ -65,7 +71,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
|
|
|
var fieldDecoder1 *structFieldDecoder
|
|
|
var fieldDecoder2 *structFieldDecoder
|
|
|
for fieldName, fieldDecoder := range fields {
|
|
|
- fieldHash := calcHash(fieldName)
|
|
|
+ fieldHash := calcHash(fieldName, ctx.caseSensitive())
|
|
|
_, known := knownHash[fieldHash]
|
|
|
if known {
|
|
|
return &generalStructDecoder{typ, fields, false}
|
|
|
@@ -88,7 +94,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
|
|
|
var fieldDecoder2 *structFieldDecoder
|
|
|
var fieldDecoder3 *structFieldDecoder
|
|
|
for fieldName, fieldDecoder := range fields {
|
|
|
- fieldHash := calcHash(fieldName)
|
|
|
+ fieldHash := calcHash(fieldName, ctx.caseSensitive())
|
|
|
_, known := knownHash[fieldHash]
|
|
|
if known {
|
|
|
return &generalStructDecoder{typ, fields, false}
|
|
|
@@ -119,7 +125,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
|
|
|
var fieldDecoder3 *structFieldDecoder
|
|
|
var fieldDecoder4 *structFieldDecoder
|
|
|
for fieldName, fieldDecoder := range fields {
|
|
|
- fieldHash := calcHash(fieldName)
|
|
|
+ fieldHash := calcHash(fieldName, ctx.caseSensitive())
|
|
|
_, known := knownHash[fieldHash]
|
|
|
if known {
|
|
|
return &generalStructDecoder{typ, fields, false}
|
|
|
@@ -156,7 +162,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
|
|
|
var fieldDecoder4 *structFieldDecoder
|
|
|
var fieldDecoder5 *structFieldDecoder
|
|
|
for fieldName, fieldDecoder := range fields {
|
|
|
- fieldHash := calcHash(fieldName)
|
|
|
+ fieldHash := calcHash(fieldName, ctx.caseSensitive())
|
|
|
_, known := knownHash[fieldHash]
|
|
|
if known {
|
|
|
return &generalStructDecoder{typ, fields, false}
|
|
|
@@ -199,7 +205,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
|
|
|
var fieldDecoder5 *structFieldDecoder
|
|
|
var fieldDecoder6 *structFieldDecoder
|
|
|
for fieldName, fieldDecoder := range fields {
|
|
|
- fieldHash := calcHash(fieldName)
|
|
|
+ fieldHash := calcHash(fieldName, ctx.caseSensitive())
|
|
|
_, known := knownHash[fieldHash]
|
|
|
if known {
|
|
|
return &generalStructDecoder{typ, fields, false}
|
|
|
@@ -248,7 +254,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
|
|
|
var fieldDecoder6 *structFieldDecoder
|
|
|
var fieldDecoder7 *structFieldDecoder
|
|
|
for fieldName, fieldDecoder := range fields {
|
|
|
- fieldHash := calcHash(fieldName)
|
|
|
+ fieldHash := calcHash(fieldName, ctx.caseSensitive())
|
|
|
_, known := knownHash[fieldHash]
|
|
|
if known {
|
|
|
return &generalStructDecoder{typ, fields, false}
|
|
|
@@ -303,7 +309,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
|
|
|
var fieldDecoder7 *structFieldDecoder
|
|
|
var fieldDecoder8 *structFieldDecoder
|
|
|
for fieldName, fieldDecoder := range fields {
|
|
|
- fieldHash := calcHash(fieldName)
|
|
|
+ fieldHash := calcHash(fieldName, ctx.caseSensitive())
|
|
|
_, known := knownHash[fieldHash]
|
|
|
if known {
|
|
|
return &generalStructDecoder{typ, fields, false}
|
|
|
@@ -364,7 +370,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
|
|
|
var fieldDecoder8 *structFieldDecoder
|
|
|
var fieldDecoder9 *structFieldDecoder
|
|
|
for fieldName, fieldDecoder := range fields {
|
|
|
- fieldHash := calcHash(fieldName)
|
|
|
+ fieldHash := calcHash(fieldName, ctx.caseSensitive())
|
|
|
_, known := knownHash[fieldHash]
|
|
|
if known {
|
|
|
return &generalStructDecoder{typ, fields, false}
|
|
|
@@ -431,7 +437,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
|
|
|
var fieldDecoder9 *structFieldDecoder
|
|
|
var fieldDecoder10 *structFieldDecoder
|
|
|
for fieldName, fieldDecoder := range fields {
|
|
|
- fieldHash := calcHash(fieldName)
|
|
|
+ fieldHash := calcHash(fieldName, ctx.caseSensitive())
|
|
|
_, known := knownHash[fieldHash]
|
|
|
if known {
|
|
|
return &generalStructDecoder{typ, fields, false}
|
|
|
@@ -513,13 +519,13 @@ func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *It
|
|
|
fieldBytes := iter.ReadStringAsSlice()
|
|
|
field = *(*string)(unsafe.Pointer(&fieldBytes))
|
|
|
fieldDecoder = decoder.fields[field]
|
|
|
- if fieldDecoder == nil {
|
|
|
+ if fieldDecoder == nil && !iter.cfg.caseSensitive {
|
|
|
fieldDecoder = decoder.fields[strings.ToLower(field)]
|
|
|
}
|
|
|
} else {
|
|
|
field = iter.ReadString()
|
|
|
fieldDecoder = decoder.fields[field]
|
|
|
- if fieldDecoder == nil {
|
|
|
+ if fieldDecoder == nil && !iter.cfg.caseSensitive {
|
|
|
fieldDecoder = decoder.fields[strings.ToLower(field)]
|
|
|
}
|
|
|
}
|