diff --git a/reflect_extension.go b/reflect_extension.go index 05e8fbf1..da597066 100644 --- a/reflect_extension.go +++ b/reflect_extension.go @@ -451,9 +451,9 @@ func processTags(structDescriptor *StructDescriptor, cfg *frozenConfig) { if binding.Field.Type().Kind() == reflect.String { binding.Decoder = &stringModeStringDecoder{binding.Decoder, cfg} binding.Encoder = &stringModeStringEncoder{binding.Encoder, cfg} - } else { - binding.Decoder = &stringModeNumberDecoder{binding.Decoder} - binding.Encoder = &stringModeNumberEncoder{binding.Encoder} + } else if binding.Field.Type().Kind() != reflect.Slice && binding.Field.Type().Kind() != reflect.Map{ + binding.Decoder = &stringModeNonStringDecoder{binding.Decoder} + binding.Encoder = &stringModeNonStringEncoder{binding.Encoder} } } } diff --git a/reflect_struct_decoder.go b/reflect_struct_decoder.go index 932641ac..204619ad 100644 --- a/reflect_struct_decoder.go +++ b/reflect_struct_decoder.go @@ -1026,14 +1026,14 @@ func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterato *((*string)(ptr)) = tempIter.ReadString() } -type stringModeNumberDecoder struct { +type stringModeNonStringDecoder struct { elemDecoder ValDecoder } -func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { +func (decoder *stringModeNonStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { c := iter.nextToken() if c != '"' { - iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) + iter.ReportError("stringModeNonStringDecoder", `expect ", but found `+string([]byte{c})) return } decoder.elemDecoder.Decode(ptr, iter) @@ -1042,7 +1042,7 @@ func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterato } c = iter.readByte() if c != '"' { - iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) + iter.ReportError("stringModeNonStringDecoder", `expect ", but found `+string([]byte{c})) return } } diff --git a/reflect_struct_encoder.go b/reflect_struct_encoder.go index d0759cf6..0795f8e2 100644 --- a/reflect_struct_encoder.go +++ b/reflect_struct_encoder.go @@ -179,17 +179,17 @@ func (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool { return false } -type stringModeNumberEncoder struct { +type stringModeNonStringEncoder struct { elemEncoder ValEncoder } -func (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { +func (encoder *stringModeNonStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { stream.writeByte('"') encoder.elemEncoder.Encode(ptr, stream) stream.writeByte('"') } -func (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool { +func (encoder *stringModeNonStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { return encoder.elemEncoder.IsEmpty(ptr) } diff --git a/type_tests/struct_tags_test.go b/type_tests/struct_tags_test.go index 66834b87..9a3bc7fd 100644 --- a/type_tests/struct_tags_test.go +++ b/type_tests/struct_tags_test.go @@ -137,6 +137,11 @@ func init() { F1 uint32 `json:"F1"` F2 uint32 `json:"F2,string"` })(nil), + (*struct { + F1 []int `json:"F1,string"` + F2 map[int]int `json:"F2,string"` + F3 bool `json:"F3,string"` + })(nil), (*struct { A string `json:"a,omitempty"` B string `json:"b,omitempty"`