@@ -2,10 +2,11 @@ package jsoniter
22
33import (
44 "fmt"
5- "github.com/modern-go/reflect2"
65 "io"
76 "strings"
87 "unsafe"
8+
9+ "github.com/modern-go/reflect2"
910)
1011
1112func decoderOfStruct (ctx * ctx , typ reflect2.Type ) ValDecoder {
@@ -31,11 +32,15 @@ func decoderOfStruct(ctx *ctx, typ reflect2.Type) ValDecoder {
3132 for k , binding := range bindings {
3233 fields [k ] = binding .Decoder .(* structFieldDecoder )
3334 }
34- for k , binding := range bindings {
35- if _ , found := fields [strings .ToLower (k )]; ! found {
36- fields [strings .ToLower (k )] = binding .Decoder .(* structFieldDecoder )
35+
36+ if ! ctx .caseSensitive () {
37+ for k , binding := range bindings {
38+ if _ , found := fields [strings .ToLower (k )]; ! found {
39+ fields [strings .ToLower (k )] = binding .Decoder .(* structFieldDecoder )
40+ }
3741 }
3842 }
43+
3944 return createStructDecoder (ctx , typ , fields )
4045}
4146
@@ -46,12 +51,13 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
4651 knownHash := map [int64 ]struct {}{
4752 0 : {},
4853 }
54+
4955 switch len (fields ) {
5056 case 0 :
5157 return & skipObjectDecoder {typ }
5258 case 1 :
5359 for fieldName , fieldDecoder := range fields {
54- fieldHash := calcHash (fieldName )
60+ fieldHash := calcHash (fieldName , ctx . caseSensitive () )
5561 _ , known := knownHash [fieldHash ]
5662 if known {
5763 return & generalStructDecoder {typ , fields , false }
@@ -65,7 +71,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
6571 var fieldDecoder1 * structFieldDecoder
6672 var fieldDecoder2 * structFieldDecoder
6773 for fieldName , fieldDecoder := range fields {
68- fieldHash := calcHash (fieldName )
74+ fieldHash := calcHash (fieldName , ctx . caseSensitive () )
6975 _ , known := knownHash [fieldHash ]
7076 if known {
7177 return & generalStructDecoder {typ , fields , false }
@@ -88,7 +94,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
8894 var fieldDecoder2 * structFieldDecoder
8995 var fieldDecoder3 * structFieldDecoder
9096 for fieldName , fieldDecoder := range fields {
91- fieldHash := calcHash (fieldName )
97+ fieldHash := calcHash (fieldName , ctx . caseSensitive () )
9298 _ , known := knownHash [fieldHash ]
9399 if known {
94100 return & generalStructDecoder {typ , fields , false }
@@ -119,7 +125,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
119125 var fieldDecoder3 * structFieldDecoder
120126 var fieldDecoder4 * structFieldDecoder
121127 for fieldName , fieldDecoder := range fields {
122- fieldHash := calcHash (fieldName )
128+ fieldHash := calcHash (fieldName , ctx . caseSensitive () )
123129 _ , known := knownHash [fieldHash ]
124130 if known {
125131 return & generalStructDecoder {typ , fields , false }
@@ -156,7 +162,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
156162 var fieldDecoder4 * structFieldDecoder
157163 var fieldDecoder5 * structFieldDecoder
158164 for fieldName , fieldDecoder := range fields {
159- fieldHash := calcHash (fieldName )
165+ fieldHash := calcHash (fieldName , ctx . caseSensitive () )
160166 _ , known := knownHash [fieldHash ]
161167 if known {
162168 return & generalStructDecoder {typ , fields , false }
@@ -199,7 +205,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
199205 var fieldDecoder5 * structFieldDecoder
200206 var fieldDecoder6 * structFieldDecoder
201207 for fieldName , fieldDecoder := range fields {
202- fieldHash := calcHash (fieldName )
208+ fieldHash := calcHash (fieldName , ctx . caseSensitive () )
203209 _ , known := knownHash [fieldHash ]
204210 if known {
205211 return & generalStructDecoder {typ , fields , false }
@@ -248,7 +254,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
248254 var fieldDecoder6 * structFieldDecoder
249255 var fieldDecoder7 * structFieldDecoder
250256 for fieldName , fieldDecoder := range fields {
251- fieldHash := calcHash (fieldName )
257+ fieldHash := calcHash (fieldName , ctx . caseSensitive () )
252258 _ , known := knownHash [fieldHash ]
253259 if known {
254260 return & generalStructDecoder {typ , fields , false }
@@ -303,7 +309,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
303309 var fieldDecoder7 * structFieldDecoder
304310 var fieldDecoder8 * structFieldDecoder
305311 for fieldName , fieldDecoder := range fields {
306- fieldHash := calcHash (fieldName )
312+ fieldHash := calcHash (fieldName , ctx . caseSensitive () )
307313 _ , known := knownHash [fieldHash ]
308314 if known {
309315 return & generalStructDecoder {typ , fields , false }
@@ -364,7 +370,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
364370 var fieldDecoder8 * structFieldDecoder
365371 var fieldDecoder9 * structFieldDecoder
366372 for fieldName , fieldDecoder := range fields {
367- fieldHash := calcHash (fieldName )
373+ fieldHash := calcHash (fieldName , ctx . caseSensitive () )
368374 _ , known := knownHash [fieldHash ]
369375 if known {
370376 return & generalStructDecoder {typ , fields , false }
@@ -431,7 +437,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF
431437 var fieldDecoder9 * structFieldDecoder
432438 var fieldDecoder10 * structFieldDecoder
433439 for fieldName , fieldDecoder := range fields {
434- fieldHash := calcHash (fieldName )
440+ fieldHash := calcHash (fieldName , ctx . caseSensitive () )
435441 _ , known := knownHash [fieldHash ]
436442 if known {
437443 return & generalStructDecoder {typ , fields , false }
@@ -513,13 +519,13 @@ func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *It
513519 fieldBytes := iter .ReadStringAsSlice ()
514520 field = * (* string )(unsafe .Pointer (& fieldBytes ))
515521 fieldDecoder = decoder .fields [field ]
516- if fieldDecoder == nil {
522+ if fieldDecoder == nil && ! iter . cfg . caseSensitive {
517523 fieldDecoder = decoder .fields [strings .ToLower (field )]
518524 }
519525 } else {
520526 field = iter .ReadString ()
521527 fieldDecoder = decoder .fields [field ]
522- if fieldDecoder == nil {
528+ if fieldDecoder == nil && ! iter . cfg . caseSensitive {
523529 fieldDecoder = decoder .fields [strings .ToLower (field )]
524530 }
525531 }
0 commit comments