mirror of
https://github.com/json-iterator/go.git
synced 2025-04-23 11:37:32 +02:00
#79 fix string tag on string field
This commit is contained in:
parent
91ef89a6a2
commit
faaa59222a
@ -277,8 +277,13 @@ func describeStruct(cfg *frozenConfig, typ reflect.Type) (*StructDescriptor, err
|
|||||||
if tagPart == "omitempty" {
|
if tagPart == "omitempty" {
|
||||||
shouldOmitEmpty = true
|
shouldOmitEmpty = true
|
||||||
} else if tagPart == "string" {
|
} else if tagPart == "string" {
|
||||||
binding.Decoder = &stringModeDecoder{binding.Decoder}
|
if binding.Field.Type.Kind() == reflect.String {
|
||||||
binding.Encoder = &stringModeEncoder{binding.Encoder}
|
binding.Decoder = &stringModeStringDecoder{binding.Decoder, cfg}
|
||||||
|
binding.Encoder = &stringModeStringEncoder{binding.Encoder, cfg}
|
||||||
|
} else {
|
||||||
|
binding.Decoder = &stringModeNumberDecoder{binding.Decoder}
|
||||||
|
binding.Encoder = &stringModeNumberEncoder{binding.Encoder}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
binding.Decoder = &structFieldDecoder{binding.Field, binding.Decoder}
|
binding.Decoder = &structFieldDecoder{binding.Field, binding.Decoder}
|
||||||
|
@ -469,14 +469,14 @@ func (encoder *base64Codec) IsEmpty(ptr unsafe.Pointer) bool {
|
|||||||
return len(*((*[]byte)(ptr))) == 0
|
return len(*((*[]byte)(ptr))) == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
type stringModeDecoder struct {
|
type stringModeNumberDecoder struct {
|
||||||
elemDecoder ValDecoder
|
elemDecoder ValDecoder
|
||||||
}
|
}
|
||||||
|
|
||||||
func (decoder *stringModeDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
||||||
c := iter.nextToken()
|
c := iter.nextToken()
|
||||||
if c != '"' {
|
if c != '"' {
|
||||||
iter.ReportError("stringModeDecoder", `expect "`)
|
iter.ReportError("stringModeNumberDecoder", `expect "`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
decoder.elemDecoder.Decode(ptr, iter)
|
decoder.elemDecoder.Decode(ptr, iter)
|
||||||
@ -485,26 +485,59 @@ func (decoder *stringModeDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
|||||||
}
|
}
|
||||||
c = iter.readByte()
|
c = iter.readByte()
|
||||||
if c != '"' {
|
if c != '"' {
|
||||||
iter.ReportError("stringModeDecoder", `expect "`)
|
iter.ReportError("stringModeNumberDecoder", `expect "`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type stringModeEncoder struct {
|
type stringModeStringDecoder struct {
|
||||||
|
elemDecoder ValDecoder
|
||||||
|
cfg *frozenConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
||||||
|
decoder.elemDecoder.Decode(ptr, iter)
|
||||||
|
str := *((*string)(ptr))
|
||||||
|
tempIter := decoder.cfg.BorrowIterator([]byte(str))
|
||||||
|
defer decoder.cfg.ReturnIterator(tempIter)
|
||||||
|
*((*string)(ptr)) = tempIter.ReadString()
|
||||||
|
}
|
||||||
|
|
||||||
|
type stringModeNumberEncoder struct {
|
||||||
elemEncoder ValEncoder
|
elemEncoder ValEncoder
|
||||||
}
|
}
|
||||||
|
|
||||||
func (encoder *stringModeEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
|
func (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
|
||||||
stream.writeByte('"')
|
stream.writeByte('"')
|
||||||
encoder.elemEncoder.Encode(ptr, stream)
|
encoder.elemEncoder.Encode(ptr, stream)
|
||||||
stream.writeByte('"')
|
stream.writeByte('"')
|
||||||
}
|
}
|
||||||
|
|
||||||
func (encoder *stringModeEncoder) EncodeInterface(val interface{}, stream *Stream) {
|
func (encoder *stringModeNumberEncoder) EncodeInterface(val interface{}, stream *Stream) {
|
||||||
WriteToStream(val, stream, encoder)
|
WriteToStream(val, stream, encoder)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (encoder *stringModeEncoder) IsEmpty(ptr unsafe.Pointer) bool {
|
func (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool {
|
||||||
|
return encoder.elemEncoder.IsEmpty(ptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
type stringModeStringEncoder struct {
|
||||||
|
elemEncoder ValEncoder
|
||||||
|
cfg *frozenConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
|
||||||
|
tempStream := encoder.cfg.BorrowStream(nil)
|
||||||
|
defer encoder.cfg.ReturnStream(tempStream)
|
||||||
|
encoder.elemEncoder.Encode(ptr, tempStream)
|
||||||
|
stream.WriteString(string(tempStream.Buffer()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (encoder *stringModeStringEncoder) EncodeInterface(val interface{}, stream *Stream) {
|
||||||
|
WriteToStream(val, stream, encoder)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (encoder *stringModeStringEncoder) IsEmpty(ptr unsafe.Pointer) bool {
|
||||||
return encoder.elemEncoder.IsEmpty(ptr)
|
return encoder.elemEncoder.IsEmpty(ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user