1
0
mirror of https://github.com/json-iterator/go.git synced 2025-04-20 11:28:49 +02:00

use extension to implement configs

This commit is contained in:
Tao Wen 2018-02-18 21:14:37 +08:00
parent 43d9384d67
commit 577ddede74
2 changed files with 44 additions and 14 deletions

View File

@ -71,22 +71,26 @@ func (cfg Config) Froze() API {
iteratorPool: make(chan *Iterator, 16), iteratorPool: make(chan *Iterator, 16),
} }
api.initCache() api.initCache()
if cfg.MarshalFloatWith6Digits {
api.marshalFloatWith6Digits()
}
encoderExtension := EncoderExtension{} encoderExtension := EncoderExtension{}
decoderExtension := DecoderExtension{}
if cfg.MarshalFloatWith6Digits {
api.marshalFloatWith6Digits(encoderExtension)
}
if cfg.EscapeHTML { if cfg.EscapeHTML {
api.escapeHTML(encoderExtension) api.escapeHTML(encoderExtension)
} }
if cfg.UseNumber { if cfg.UseNumber {
api.useNumber() api.useNumber(decoderExtension)
} }
if cfg.ValidateJsonRawMessage { if cfg.ValidateJsonRawMessage {
api.validateJsonRawMessage() api.validateJsonRawMessage(encoderExtension)
} }
if len(encoderExtension) > 0 { if len(encoderExtension) > 0 {
api.extensions = append(api.extensions, encoderExtension) api.extensions = append(api.extensions, encoderExtension)
} }
if len(decoderExtension) > 0 {
api.extensions = append(api.extensions, decoderExtension)
}
api.configBeforeFrozen = cfg api.configBeforeFrozen = cfg
return api return api
} }
@ -101,7 +105,7 @@ func (cfg Config) frozeWithCacheReuse() *frozenConfig {
return api return api
} }
func (cfg *frozenConfig) validateJsonRawMessage() { func (cfg *frozenConfig) validateJsonRawMessage(extension EncoderExtension) {
encoder := &funcEncoder{func(ptr unsafe.Pointer, stream *Stream) { encoder := &funcEncoder{func(ptr unsafe.Pointer, stream *Stream) {
rawMessage := *(*json.RawMessage)(ptr) rawMessage := *(*json.RawMessage)(ptr)
iter := cfg.BorrowIterator([]byte(rawMessage)) iter := cfg.BorrowIterator([]byte(rawMessage))
@ -115,18 +119,18 @@ func (cfg *frozenConfig) validateJsonRawMessage() {
}, func(ptr unsafe.Pointer) bool { }, func(ptr unsafe.Pointer) bool {
return false return false
}} }}
cfg.addEncoderToCache(reflect.TypeOf((*json.RawMessage)(nil)).Elem(), encoder) extension[reflect.TypeOf((*json.RawMessage)(nil)).Elem()] = encoder
cfg.addEncoderToCache(reflect.TypeOf((*RawMessage)(nil)).Elem(), encoder) extension[reflect.TypeOf((*RawMessage)(nil)).Elem()] = encoder
} }
func (cfg *frozenConfig) useNumber() { func (cfg *frozenConfig) useNumber(extension DecoderExtension) {
cfg.addDecoderToCache(reflect.TypeOf((*interface{})(nil)).Elem(), &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) { extension[reflect.TypeOf((*interface{})(nil)).Elem()] = &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) {
if iter.WhatIsNext() == NumberValue { if iter.WhatIsNext() == NumberValue {
*((*interface{})(ptr)) = json.Number(iter.readNumberAsString()) *((*interface{})(ptr)) = json.Number(iter.readNumberAsString())
} else { } else {
*((*interface{})(ptr)) = iter.Read() *((*interface{})(ptr)) = iter.Read()
} }
}}) }}
} }
func (cfg *frozenConfig) getTagKey() string { func (cfg *frozenConfig) getTagKey() string {
tagKey := cfg.configBeforeFrozen.TagKey tagKey := cfg.configBeforeFrozen.TagKey
@ -164,10 +168,10 @@ func (encoder *lossyFloat64Encoder) IsEmpty(ptr unsafe.Pointer) bool {
// EnableLossyFloatMarshalling keeps 10**(-6) precision // EnableLossyFloatMarshalling keeps 10**(-6) precision
// for float variables for better performance. // for float variables for better performance.
func (cfg *frozenConfig) marshalFloatWith6Digits() { func (cfg *frozenConfig) marshalFloatWith6Digits(extension EncoderExtension) {
// for better performance // for better performance
cfg.addEncoderToCache(reflect.TypeOf((*float32)(nil)).Elem(), &lossyFloat32Encoder{}) extension[reflect.TypeOf((*float32)(nil)).Elem()] = &lossyFloat32Encoder{}
cfg.addEncoderToCache(reflect.TypeOf((*float64)(nil)).Elem(), &lossyFloat64Encoder{}) extension[reflect.TypeOf((*float64)(nil)).Elem()] = &lossyFloat64Encoder{}
} }
type htmlEscapedStringEncoder struct { type htmlEscapedStringEncoder struct {

View File

@ -106,6 +106,32 @@ func (extension EncoderExtension) DecorateEncoder(typ reflect.Type, encoder ValE
return encoder return encoder
} }
type DecoderExtension map[reflect.Type]ValDecoder
// UpdateStructDescriptor No-op
func (extension DecoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) {
}
// CreateDecoder get decoder from map
func (extension DecoderExtension) CreateDecoder(typ reflect.Type) ValDecoder {
return extension[typ]
}
// CreateEncoder No-op
func (extension DecoderExtension) CreateEncoder(typ reflect.Type) ValEncoder {
return nil
}
// DecorateDecoder No-op
func (extension DecoderExtension) DecorateDecoder(typ reflect.Type, decoder ValDecoder) ValDecoder {
return decoder
}
// DecorateEncoder No-op
func (extension DecoderExtension) DecorateEncoder(typ reflect.Type, encoder ValEncoder) ValEncoder {
return encoder
}
type funcDecoder struct { type funcDecoder struct {
fun DecoderFunc fun DecoderFunc
} }