github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/jsoni/extra/privat_fields.go (about) 1 package extra 2 3 import ( 4 "strings" 5 "unicode" 6 7 "github.com/bingoohuang/gg/pkg/jsoni" 8 ) 9 10 // SupportPrivateFields include private fields when encoding/decoding 11 func SupportPrivateFields() { 12 jsoni.RegisterExtension(&privateFieldsExtension{}) 13 } 14 15 type privateFieldsExtension struct { 16 jsoni.DummyExtension 17 } 18 19 func (extension *privateFieldsExtension) UpdateStructDescriptor(structDescriptor *jsoni.StructDescriptor) { 20 for _, binding := range structDescriptor.Fields { 21 if isPrivate := unicode.IsLower(rune(binding.Field.Name()[0])); !isPrivate { 22 continue 23 } 24 25 tag, hastag := binding.Field.Tag().Lookup("json") 26 if !hastag { 27 binding.FromNames = []string{binding.Field.Name()} 28 binding.ToNames = []string{binding.Field.Name()} 29 continue 30 } 31 tagParts := strings.Split(tag, ",") 32 names := calcFieldNames(binding.Field.Name(), tagParts[0], tag) 33 binding.FromNames = names 34 binding.ToNames = names 35 } 36 } 37 38 func calcFieldNames(originalFieldName string, tagProvidedFieldName string, wholeTag string) []string { 39 // ignore? 40 if wholeTag == "-" { 41 return []string{} 42 } 43 // rename? 44 var fieldNames []string 45 if tagProvidedFieldName == "" { 46 fieldNames = []string{originalFieldName} 47 } else { 48 fieldNames = []string{tagProvidedFieldName} 49 } 50 // private? 51 isNotExported := unicode.IsLower(rune(originalFieldName[0])) 52 if isNotExported { 53 fieldNames = []string{} 54 } 55 return fieldNames 56 }