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

use extension to implement EscapeHtml config option

This commit is contained in:
Tao Wen 2018-02-17 22:55:35 +08:00
parent ef3038593b
commit 2074f25bd3
2 changed files with 33 additions and 3 deletions

View File

@ -74,8 +74,9 @@ func (cfg Config) Froze() API {
if cfg.MarshalFloatWith6Digits {
api.marshalFloatWith6Digits()
}
encoderExtension := EncoderExtension{}
if cfg.EscapeHTML {
api.escapeHTML()
api.escapeHTML(encoderExtension)
}
if cfg.UseNumber {
api.useNumber()
@ -83,6 +84,9 @@ func (cfg Config) Froze() API {
if cfg.ValidateJsonRawMessage {
api.validateJsonRawMessage()
}
if len(encoderExtension) > 0 {
api.extensions = append(api.extensions, encoderExtension)
}
api.configBeforeFrozen = cfg
return api
}
@ -178,8 +182,8 @@ func (encoder *htmlEscapedStringEncoder) IsEmpty(ptr unsafe.Pointer) bool {
return *((*string)(ptr)) == ""
}
func (cfg *frozenConfig) escapeHTML() {
cfg.addEncoderToCache(reflect.TypeOf((*string)(nil)).Elem(), &htmlEscapedStringEncoder{})
func (cfg *frozenConfig) escapeHTML(encoderExtension EncoderExtension) {
encoderExtension[reflect.TypeOf((*string)(nil)).Elem()] = &htmlEscapedStringEncoder{}
}
func (cfg *frozenConfig) cleanDecoders() {

View File

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