Skip to content

Commit 3c4fb2b

Browse files
committed
fix(processTags): remove extra qoutes that added to slice and map type
when use json tag have a string value it should convert numbers and boolean to string but iy should not add qoutes to slice and map type as go json package do. issue #395
1 parent 819acad commit 3c4fb2b

File tree

4 files changed

+15
-10
lines changed

4 files changed

+15
-10
lines changed

reflect_extension.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -451,9 +451,9 @@ func processTags(structDescriptor *StructDescriptor, cfg *frozenConfig) {
451451
if binding.Field.Type().Kind() == reflect.String {
452452
binding.Decoder = &stringModeStringDecoder{binding.Decoder, cfg}
453453
binding.Encoder = &stringModeStringEncoder{binding.Encoder, cfg}
454-
} else {
455-
binding.Decoder = &stringModeNumberDecoder{binding.Decoder}
456-
binding.Encoder = &stringModeNumberEncoder{binding.Encoder}
454+
} else if binding.Field.Type().Kind() != reflect.Slice && binding.Field.Type().Kind() != reflect.Map{
455+
binding.Decoder = &stringModeNonStringDecoder{binding.Decoder}
456+
binding.Encoder = &stringModeNonStringEncoder{binding.Encoder}
457457
}
458458
}
459459
}

reflect_struct_decoder.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,14 +1026,14 @@ func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterato
10261026
*((*string)(ptr)) = tempIter.ReadString()
10271027
}
10281028

1029-
type stringModeNumberDecoder struct {
1029+
type stringModeNonStringDecoder struct {
10301030
elemDecoder ValDecoder
10311031
}
10321032

1033-
func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
1033+
func (decoder *stringModeNonStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
10341034
c := iter.nextToken()
10351035
if c != '"' {
1036-
iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c}))
1036+
iter.ReportError("stringModeNonStringDecoder", `expect ", but found `+string([]byte{c}))
10371037
return
10381038
}
10391039
decoder.elemDecoder.Decode(ptr, iter)
@@ -1042,7 +1042,7 @@ func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterato
10421042
}
10431043
c = iter.readByte()
10441044
if c != '"' {
1045-
iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c}))
1045+
iter.ReportError("stringModeNonStringDecoder", `expect ", but found `+string([]byte{c}))
10461046
return
10471047
}
10481048
}

reflect_struct_encoder.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,17 +179,17 @@ func (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool {
179179
return false
180180
}
181181

182-
type stringModeNumberEncoder struct {
182+
type stringModeNonStringEncoder struct {
183183
elemEncoder ValEncoder
184184
}
185185

186-
func (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
186+
func (encoder *stringModeNonStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
187187
stream.writeByte('"')
188188
encoder.elemEncoder.Encode(ptr, stream)
189189
stream.writeByte('"')
190190
}
191191

192-
func (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool {
192+
func (encoder *stringModeNonStringEncoder) IsEmpty(ptr unsafe.Pointer) bool {
193193
return encoder.elemEncoder.IsEmpty(ptr)
194194
}
195195

type_tests/struct_tags_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,11 @@ func init() {
137137
F1 uint32 `json:"F1"`
138138
F2 uint32 `json:"F2,string"`
139139
})(nil),
140+
(*struct {
141+
F1 []int `json:"F1,string"`
142+
F2 map[int]int `json:"F2,string"`
143+
F3 bool `json:"F3,string"`
144+
})(nil),
140145
(*struct {
141146
A string `json:"a,omitempty"`
142147
B string `json:"b,omitempty"`

0 commit comments

Comments
 (0)