diff --git a/extra/privat_fields.go b/extra/privat_fields.go index ac7096f..0cfd549 100644 --- a/extra/privat_fields.go +++ b/extra/privat_fields.go @@ -3,6 +3,7 @@ package extra import ( "github.com/json-iterator/go" "unicode" + "strings" ) // SupportPrivateFields include private fields when encoding/decoding @@ -18,8 +19,37 @@ func (extension *privateFieldsExtension) UpdateStructDescriptor(structDescriptor for _, binding := range structDescriptor.Fields { isPrivate := unicode.IsLower(rune(binding.Field.Name()[0])) if isPrivate { - binding.FromNames = []string{binding.Field.Name()} - binding.ToNames = []string{binding.Field.Name()} + tag, hastag := binding.Field.Tag().Lookup("json") + if !hastag { + binding.FromNames = []string{binding.Field.Name()} + binding.ToNames = []string{binding.Field.Name()} + continue + } + tagParts := strings.Split(tag, ",") + names := calcFieldNames(binding.Field.Name(), tagParts[0], tag) + binding.FromNames = names + binding.ToNames = names } } } + +func calcFieldNames(originalFieldName string, tagProvidedFieldName string, wholeTag string) []string { + // ignore? + if wholeTag == "-" { + return []string{} + } + // rename? + var fieldNames []string + if tagProvidedFieldName == "" { + fieldNames = []string{originalFieldName} + } else { + fieldNames = []string{tagProvidedFieldName} + } + // private? + isNotExported := unicode.IsLower(rune(originalFieldName[0])) + if isNotExported { + fieldNames = []string{} + } + return fieldNames +} +