You've already forked json-iterator
							
							
				mirror of
				https://github.com/json-iterator/go.git
				synced 2025-10-31 00:07:40 +02:00 
			
		
		
		
	#146 support config TagKey
This commit is contained in:
		| @@ -17,6 +17,7 @@ type Config struct { | |||||||
| 	EscapeHTML              bool | 	EscapeHTML              bool | ||||||
| 	SortMapKeys             bool | 	SortMapKeys             bool | ||||||
| 	UseNumber               bool | 	UseNumber               bool | ||||||
|  | 	TagKey					string | ||||||
| } | } | ||||||
|  |  | ||||||
| type frozenConfig struct { | type frozenConfig struct { | ||||||
| @@ -95,6 +96,13 @@ func (cfg *frozenConfig) useNumber() { | |||||||
| 		} | 		} | ||||||
| 	}}) | 	}}) | ||||||
| } | } | ||||||
|  | func (cfg *frozenConfig) getTagKey() string { | ||||||
|  | 	tagKey := cfg.configBeforeFrozen.TagKey | ||||||
|  | 	if tagKey == "" { | ||||||
|  | 		return "json" | ||||||
|  | 	} | ||||||
|  | 	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) | ||||||
|   | |||||||
| @@ -227,7 +227,7 @@ func describeStruct(cfg *frozenConfig, typ reflect.Type) (*StructDescriptor, err | |||||||
| 	bindings := []*Binding{} | 	bindings := []*Binding{} | ||||||
| 	for i := 0; i < typ.NumField(); i++ { | 	for i := 0; i < typ.NumField(); i++ { | ||||||
| 		field := typ.Field(i) | 		field := typ.Field(i) | ||||||
| 		tag := field.Tag.Get("json") | 		tag := field.Tag.Get(cfg.getTagKey()) | ||||||
| 		tagParts := strings.Split(tag, ",") | 		tagParts := strings.Split(tag, ",") | ||||||
| 		if tag == "-" { | 		if tag == "-" { | ||||||
| 			continue | 			continue | ||||||
| @@ -373,7 +373,7 @@ func (bindings sortableBindings) Swap(i, j int) { | |||||||
| func processTags(structDescriptor *StructDescriptor, cfg *frozenConfig) { | func processTags(structDescriptor *StructDescriptor, cfg *frozenConfig) { | ||||||
| 	for _, binding := range structDescriptor.Fields { | 	for _, binding := range structDescriptor.Fields { | ||||||
| 		shouldOmitEmpty := false | 		shouldOmitEmpty := false | ||||||
| 		tagParts := strings.Split(binding.Field.Tag.Get("json"), ",") | 		tagParts := strings.Split(binding.Field.Tag.Get(cfg.getTagKey()), ",") | ||||||
| 		for _, tagPart := range tagParts[1:] { | 		for _, tagPart := range tagParts[1:] { | ||||||
| 			if tagPart == "omitempty" { | 			if tagPart == "omitempty" { | ||||||
| 				shouldOmitEmpty = true | 				shouldOmitEmpty = true | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ func encoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { | |||||||
| 				if old.toName != toName { | 				if old.toName != toName { | ||||||
| 					continue | 					continue | ||||||
| 				} | 				} | ||||||
| 				old.ignored, new.ignored = resolveConflictBinding(old.binding, new.binding) | 				old.ignored, new.ignored = resolveConflictBinding(cfg, old.binding, new.binding) | ||||||
| 			} | 			} | ||||||
| 			orderedBindings = append(orderedBindings, new) | 			orderedBindings = append(orderedBindings, new) | ||||||
| 		} | 		} | ||||||
| @@ -49,9 +49,9 @@ func encoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { | |||||||
| 	return &structEncoder{structDescriptor.onePtrEmbedded, structDescriptor.onePtrOptimization, finalOrderedFields}, nil | 	return &structEncoder{structDescriptor.onePtrEmbedded, structDescriptor.onePtrOptimization, finalOrderedFields}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func resolveConflictBinding(old, new *Binding) (ignoreOld, ignoreNew bool) { | func resolveConflictBinding(cfg *frozenConfig, old, new *Binding) (ignoreOld, ignoreNew bool) { | ||||||
| 	newTagged := new.Field.Tag.Get("json") != "" | 	newTagged := new.Field.Tag.Get(cfg.getTagKey()) != "" | ||||||
| 	oldTagged := old.Field.Tag.Get("json") != "" | 	oldTagged := old.Field.Tag.Get(cfg.getTagKey()) != "" | ||||||
| 	if newTagged { | 	if newTagged { | ||||||
| 		if oldTagged { | 		if oldTagged { | ||||||
| 			if len(old.levels) > len(new.levels) { | 			if len(old.levels) > len(new.levels) { | ||||||
| @@ -91,7 +91,7 @@ func decoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { | |||||||
| 				bindings[fromName] = binding | 				bindings[fromName] = binding | ||||||
| 				continue | 				continue | ||||||
| 			} | 			} | ||||||
| 			ignoreOld, ignoreNew := resolveConflictBinding(old, binding) | 			ignoreOld, ignoreNew := resolveConflictBinding(cfg, old, binding) | ||||||
| 			if ignoreOld { | 			if ignoreOld { | ||||||
| 				delete(bindings, fromName) | 				delete(bindings, fromName) | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -7,8 +7,6 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
| 	"unsafe" | 	"unsafe" | ||||||
| 	"fmt" |  | ||||||
| 	"reflect" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func Test_customize_type_decoder(t *testing.T) { | func Test_customize_type_decoder(t *testing.T) { | ||||||
| @@ -307,3 +305,17 @@ func Test_unmarshal_empty_interface_as_int64(t *testing.T) { | |||||||
| 	Unmarshal([]byte("[100]"), &arr) | 	Unmarshal([]byte("[100]"), &arr) | ||||||
| 	should.Equal(int64(100), arr[0]) | 	should.Equal(int64(100), arr[0]) | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | func Test_customize_tag_key(t *testing.T) { | ||||||
|  |  | ||||||
|  | 	type TestObject struct { | ||||||
|  | 		Field string `orm:"field"` | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	should := require.New(t) | ||||||
|  | 	json := Config{TagKey: "orm"}.Froze() | ||||||
|  | 	str, err := json.MarshalToString(TestObject{"hello"}) | ||||||
|  | 	should.Nil(err) | ||||||
|  | 	should.Equal(`{"field":"hello"}`, str) | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user