123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- 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
- }
|