diff --git a/extra/naming_strategy.go b/extra/naming_strategy.go index 671e4951..94417f50 100644 --- a/extra/naming_strategy.go +++ b/extra/naming_strategy.go @@ -17,8 +17,10 @@ type namingStrategyExtension struct { func (extension *namingStrategyExtension) UpdateStructDescriptor(structDescriptor *jsoniter.StructDescriptor) { for _, binding := range structDescriptor.Fields { - binding.ToNames = []string{extension.translate(binding.Field.Name())} - binding.FromNames = []string{extension.translate(binding.Field.Name())} + if !binding.IgnoreOverride { + binding.ToNames = []string{extension.translate(binding.Field.Name())} + binding.FromNames = []string{extension.translate(binding.Field.Name())} + } } } diff --git a/reflect_extension.go b/reflect_extension.go index 917bbe84..5486ec53 100644 --- a/reflect_extension.go +++ b/reflect_extension.go @@ -35,12 +35,13 @@ func (structDescriptor *StructDescriptor) GetField(fieldName string) *Binding { // Binding describe how should we encode/decode the struct field type Binding struct { - levels []int - Field reflect2.StructField - FromNames []string - ToNames []string - Encoder ValEncoder - Decoder ValDecoder + levels []int + Field reflect2.StructField + FromNames []string + ToNames []string + Encoder ValEncoder + Decoder ValDecoder + IgnoreOverride bool } // Extension the one for all SPI. Customize encoding/decoding by specifying alternate encoder/decoder. @@ -363,7 +364,7 @@ func describeStruct(ctx *ctx, typ reflect2.Type) *StructDescriptor { } } } - fieldNames := calcFieldNames(field.Name(), tagParts[0], tag) + fieldNames, ignoreNameOverrides := calcFieldNames(field.Name(), tagParts[0], tag) fieldCacheKey := fmt.Sprintf("%s/%s", typ.String(), field.Name()) decoder := fieldDecoders[fieldCacheKey] if decoder == nil { @@ -374,11 +375,12 @@ func describeStruct(ctx *ctx, typ reflect2.Type) *StructDescriptor { encoder = encoderOfType(ctx.append(field.Name()), field.Type()) } binding := &Binding{ - Field: field, - FromNames: fieldNames, - ToNames: fieldNames, - Decoder: decoder, - Encoder: encoder, + Field: field, + FromNames: fieldNames, + ToNames: fieldNames, + Decoder: decoder, + Encoder: encoder, + IgnoreOverride: ignoreNameOverrides, } binding.levels = []int{i} bindings = append(bindings, binding) @@ -450,22 +452,26 @@ func processTags(structDescriptor *StructDescriptor, cfg *frozenConfig) { } } -func calcFieldNames(originalFieldName string, tagProvidedFieldName string, wholeTag string) []string { +func calcFieldNames(originalFieldName string, tagProvidedFieldName string, wholeTag string) ([]string, bool) { + var ignoreNamingStrategy bool // conditions for which we should ignore custom naming strategy // ignore? if wholeTag == "-" { - return []string{} + ignoreNamingStrategy = true + return []string{}, ignoreNamingStrategy } // rename? var fieldNames []string if tagProvidedFieldName == "" { fieldNames = []string{originalFieldName} } else { + ignoreNamingStrategy = true fieldNames = []string{tagProvidedFieldName} + } // private? isNotExported := unicode.IsLower(rune(originalFieldName[0])) if isNotExported { fieldNames = []string{} } - return fieldNames + return fieldNames, ignoreNamingStrategy }