You've already forked json-iterator
							
							
				mirror of
				https://github.com/json-iterator/go.git
				synced 2025-10-31 00:07:40 +02:00 
			
		
		
		
	support config level extension
This commit is contained in:
		| @@ -48,6 +48,7 @@ type API interface { | ||||
| 	NewEncoder(writer io.Writer) *Encoder | ||||
| 	NewDecoder(reader io.Reader) *Decoder | ||||
| 	Valid(data []byte) bool | ||||
| 	RegisterExtension(extension Extension) | ||||
| } | ||||
|  | ||||
| // ConfigDefault the default API | ||||
| @@ -132,7 +133,7 @@ func (cfg *frozenConfig) getTagKey() string { | ||||
| 	return tagKey | ||||
| } | ||||
|  | ||||
| func (cfg *frozenConfig) registerExtension(extension Extension) { | ||||
| func (cfg *frozenConfig) RegisterExtension(extension Extension) { | ||||
| 	cfg.extensions = append(cfg.extensions, extension) | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -274,7 +274,7 @@ func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { | ||||
| 	if decoder != nil { | ||||
| 		return decoder, nil | ||||
| 	} | ||||
| 	decoder = getTypeDecoderFromExtension(typ) | ||||
| 	decoder = getTypeDecoderFromExtension(cfg, typ) | ||||
| 	if decoder != nil { | ||||
| 		cfg.addDecoderToCache(cacheKey, decoder) | ||||
| 		return decoder, nil | ||||
| @@ -285,6 +285,9 @@ func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { | ||||
| 	for _, extension := range extensions { | ||||
| 		decoder = extension.DecorateDecoder(typ, decoder) | ||||
| 	} | ||||
| 	for _, extension := range cfg.extensions { | ||||
| 		decoder = extension.DecorateDecoder(typ, decoder) | ||||
| 	} | ||||
| 	cfg.addDecoderToCache(cacheKey, decoder) | ||||
| 	return decoder, err | ||||
| } | ||||
| @@ -441,7 +444,7 @@ func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { | ||||
| 	if encoder != nil { | ||||
| 		return encoder, nil | ||||
| 	} | ||||
| 	encoder = getTypeEncoderFromExtension(typ) | ||||
| 	encoder = getTypeEncoderFromExtension(cfg, typ) | ||||
| 	if encoder != nil { | ||||
| 		cfg.addEncoderToCache(cacheKey, encoder) | ||||
| 		return encoder, nil | ||||
| @@ -452,6 +455,9 @@ func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { | ||||
| 	for _, extension := range extensions { | ||||
| 		encoder = extension.DecorateEncoder(typ, encoder) | ||||
| 	} | ||||
| 	for _, extension := range cfg.extensions { | ||||
| 		encoder = extension.DecorateEncoder(typ, encoder) | ||||
| 	} | ||||
| 	cfg.addEncoderToCache(cacheKey, encoder) | ||||
| 	return encoder, err | ||||
| } | ||||
|   | ||||
| @@ -161,22 +161,31 @@ func RegisterExtension(extension Extension) { | ||||
| 	extensions = append(extensions, extension) | ||||
| } | ||||
|  | ||||
| func getTypeDecoderFromExtension(typ reflect.Type) ValDecoder { | ||||
| 	decoder := _getTypeDecoderFromExtension(typ) | ||||
| func getTypeDecoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValDecoder { | ||||
| 	decoder := _getTypeDecoderFromExtension(cfg, typ) | ||||
| 	if decoder != nil { | ||||
| 		for _, extension := range extensions { | ||||
| 			decoder = extension.DecorateDecoder(typ, decoder) | ||||
| 		} | ||||
| 		for _, extension := range cfg.extensions { | ||||
| 			decoder = extension.DecorateDecoder(typ, decoder) | ||||
| 		} | ||||
| 	} | ||||
| 	return decoder | ||||
| } | ||||
| func _getTypeDecoderFromExtension(typ reflect.Type) ValDecoder { | ||||
| func _getTypeDecoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValDecoder { | ||||
| 	for _, extension := range extensions { | ||||
| 		decoder := extension.CreateDecoder(typ) | ||||
| 		if decoder != nil { | ||||
| 			return decoder | ||||
| 		} | ||||
| 	} | ||||
| 	for _, extension := range cfg.extensions { | ||||
| 		decoder := extension.CreateDecoder(typ) | ||||
| 		if decoder != nil { | ||||
| 			return decoder | ||||
| 		} | ||||
| 	} | ||||
| 	typeName := typ.String() | ||||
| 	decoder := typeDecoders[typeName] | ||||
| 	if decoder != nil { | ||||
| @@ -191,23 +200,32 @@ func _getTypeDecoderFromExtension(typ reflect.Type) ValDecoder { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func getTypeEncoderFromExtension(typ reflect.Type) ValEncoder { | ||||
| 	encoder := _getTypeEncoderFromExtension(typ) | ||||
| func getTypeEncoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValEncoder { | ||||
| 	encoder := _getTypeEncoderFromExtension(cfg, typ) | ||||
| 	if encoder != nil { | ||||
| 		for _, extension := range extensions { | ||||
| 			encoder = extension.DecorateEncoder(typ, encoder) | ||||
| 		} | ||||
| 		for _, extension := range cfg.extensions { | ||||
| 			encoder = extension.DecorateEncoder(typ, encoder) | ||||
| 		} | ||||
| 	} | ||||
| 	return encoder | ||||
| } | ||||
|  | ||||
| func _getTypeEncoderFromExtension(typ reflect.Type) ValEncoder { | ||||
| func _getTypeEncoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValEncoder { | ||||
| 	for _, extension := range extensions { | ||||
| 		encoder := extension.CreateEncoder(typ) | ||||
| 		if encoder != nil { | ||||
| 			return encoder | ||||
| 		} | ||||
| 	} | ||||
| 	for _, extension := range cfg.extensions { | ||||
| 		encoder := extension.CreateEncoder(typ) | ||||
| 		if encoder != nil { | ||||
| 			return encoder | ||||
| 		} | ||||
| 	} | ||||
| 	typeName := typ.String() | ||||
| 	encoder := typeEncoders[typeName] | ||||
| 	if encoder != nil { | ||||
| @@ -324,6 +342,9 @@ func createStructDescriptor(cfg *frozenConfig, typ reflect.Type, bindings []*Bin | ||||
| 	for _, extension := range extensions { | ||||
| 		extension.UpdateStructDescriptor(structDescriptor) | ||||
| 	} | ||||
| 	for _, extension := range cfg.extensions { | ||||
| 		extension.UpdateStructDescriptor(structDescriptor) | ||||
| 	} | ||||
| 	processTags(structDescriptor, cfg) | ||||
| 	// merge normal & embedded bindings & sort with original order | ||||
| 	allBindings := sortableBindings(append(embeddedBindings, structDescriptor.Fields...)) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user