1
0
mirror of https://github.com/json-iterator/go.git synced 2025-05-19 21:53:05 +02:00

support config level extension

This commit is contained in:
Tao Wen 2017-11-23 00:09:35 +08:00
parent f7279a603e
commit ff2b70c1db
3 changed files with 37 additions and 9 deletions

View File

@ -48,6 +48,7 @@ type API interface {
NewEncoder(writer io.Writer) *Encoder NewEncoder(writer io.Writer) *Encoder
NewDecoder(reader io.Reader) *Decoder NewDecoder(reader io.Reader) *Decoder
Valid(data []byte) bool Valid(data []byte) bool
RegisterExtension(extension Extension)
} }
// ConfigDefault the default API // ConfigDefault the default API
@ -132,7 +133,7 @@ func (cfg *frozenConfig) getTagKey() string {
return tagKey return tagKey
} }
func (cfg *frozenConfig) registerExtension(extension Extension) { func (cfg *frozenConfig) RegisterExtension(extension Extension) {
cfg.extensions = append(cfg.extensions, extension) cfg.extensions = append(cfg.extensions, extension)
} }

View File

@ -274,7 +274,7 @@ func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
if decoder != nil { if decoder != nil {
return decoder, nil return decoder, nil
} }
decoder = getTypeDecoderFromExtension(typ) decoder = getTypeDecoderFromExtension(cfg, typ)
if decoder != nil { if decoder != nil {
cfg.addDecoderToCache(cacheKey, decoder) cfg.addDecoderToCache(cacheKey, decoder)
return decoder, nil return decoder, nil
@ -285,6 +285,9 @@ func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
for _, extension := range extensions { for _, extension := range extensions {
decoder = extension.DecorateDecoder(typ, decoder) decoder = extension.DecorateDecoder(typ, decoder)
} }
for _, extension := range cfg.extensions {
decoder = extension.DecorateDecoder(typ, decoder)
}
cfg.addDecoderToCache(cacheKey, decoder) cfg.addDecoderToCache(cacheKey, decoder)
return decoder, err return decoder, err
} }
@ -441,7 +444,7 @@ func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
if encoder != nil { if encoder != nil {
return encoder, nil return encoder, nil
} }
encoder = getTypeEncoderFromExtension(typ) encoder = getTypeEncoderFromExtension(cfg, typ)
if encoder != nil { if encoder != nil {
cfg.addEncoderToCache(cacheKey, encoder) cfg.addEncoderToCache(cacheKey, encoder)
return encoder, nil return encoder, nil
@ -452,6 +455,9 @@ func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
for _, extension := range extensions { for _, extension := range extensions {
encoder = extension.DecorateEncoder(typ, encoder) encoder = extension.DecorateEncoder(typ, encoder)
} }
for _, extension := range cfg.extensions {
encoder = extension.DecorateEncoder(typ, encoder)
}
cfg.addEncoderToCache(cacheKey, encoder) cfg.addEncoderToCache(cacheKey, encoder)
return encoder, err return encoder, err
} }

View File

@ -161,22 +161,31 @@ func RegisterExtension(extension Extension) {
extensions = append(extensions, extension) extensions = append(extensions, extension)
} }
func getTypeDecoderFromExtension(typ reflect.Type) ValDecoder { func getTypeDecoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValDecoder {
decoder := _getTypeDecoderFromExtension(typ) decoder := _getTypeDecoderFromExtension(cfg, typ)
if decoder != nil { if decoder != nil {
for _, extension := range extensions { for _, extension := range extensions {
decoder = extension.DecorateDecoder(typ, decoder) decoder = extension.DecorateDecoder(typ, decoder)
} }
for _, extension := range cfg.extensions {
decoder = extension.DecorateDecoder(typ, decoder)
}
} }
return decoder return decoder
} }
func _getTypeDecoderFromExtension(typ reflect.Type) ValDecoder { func _getTypeDecoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValDecoder {
for _, extension := range extensions { for _, extension := range extensions {
decoder := extension.CreateDecoder(typ) decoder := extension.CreateDecoder(typ)
if decoder != nil { if decoder != nil {
return decoder return decoder
} }
} }
for _, extension := range cfg.extensions {
decoder := extension.CreateDecoder(typ)
if decoder != nil {
return decoder
}
}
typeName := typ.String() typeName := typ.String()
decoder := typeDecoders[typeName] decoder := typeDecoders[typeName]
if decoder != nil { if decoder != nil {
@ -191,23 +200,32 @@ func _getTypeDecoderFromExtension(typ reflect.Type) ValDecoder {
return nil return nil
} }
func getTypeEncoderFromExtension(typ reflect.Type) ValEncoder { func getTypeEncoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValEncoder {
encoder := _getTypeEncoderFromExtension(typ) encoder := _getTypeEncoderFromExtension(cfg, typ)
if encoder != nil { if encoder != nil {
for _, extension := range extensions { for _, extension := range extensions {
encoder = extension.DecorateEncoder(typ, encoder) encoder = extension.DecorateEncoder(typ, encoder)
} }
for _, extension := range cfg.extensions {
encoder = extension.DecorateEncoder(typ, encoder)
}
} }
return encoder return encoder
} }
func _getTypeEncoderFromExtension(typ reflect.Type) ValEncoder { func _getTypeEncoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValEncoder {
for _, extension := range extensions { for _, extension := range extensions {
encoder := extension.CreateEncoder(typ) encoder := extension.CreateEncoder(typ)
if encoder != nil { if encoder != nil {
return encoder return encoder
} }
} }
for _, extension := range cfg.extensions {
encoder := extension.CreateEncoder(typ)
if encoder != nil {
return encoder
}
}
typeName := typ.String() typeName := typ.String()
encoder := typeEncoders[typeName] encoder := typeEncoders[typeName]
if encoder != nil { if encoder != nil {
@ -324,6 +342,9 @@ func createStructDescriptor(cfg *frozenConfig, typ reflect.Type, bindings []*Bin
for _, extension := range extensions { for _, extension := range extensions {
extension.UpdateStructDescriptor(structDescriptor) extension.UpdateStructDescriptor(structDescriptor)
} }
for _, extension := range cfg.extensions {
extension.UpdateStructDescriptor(structDescriptor)
}
processTags(structDescriptor, cfg) processTags(structDescriptor, cfg)
// merge normal & embedded bindings & sort with original order // merge normal & embedded bindings & sort with original order
allBindings := sortableBindings(append(embeddedBindings, structDescriptor.Fields...)) allBindings := sortableBindings(append(embeddedBindings, structDescriptor.Fields...))