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:
parent
f7279a603e
commit
ff2b70c1db
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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...))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user