package extra import ( "github.com/json-iterator/go" "strings" "unicode" ) // SupportPrivateFields include private fields when encoding/decoding func SupportPrivateFields() { jsoniter.RegisterExtension(&privateFieldsExtension{}) } type privateFieldsExtension struct { jsoniter.DummyExtension } func (extension *privateFieldsExtension) UpdateStructDescriptor(structDescriptor *jsoniter.StructDescriptor) { for _, binding := range structDescriptor.Fields { isPrivate := unicode.IsLower(rune(binding.Field.Name()[0])) if isPrivate { 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 }