| package extra |
| |
| import ( |
| "github.com/json-iterator/go" |
| "strings" |
| "unicode" |
| ) |
| |
| // SetNamingStrategy rename struct fields uniformly |
| func SetNamingStrategy(translate func(string) string) { |
| jsoniter.RegisterExtension(&namingStrategyExtension{jsoniter.DummyExtension{}, translate}) |
| } |
| |
| type namingStrategyExtension struct { |
| jsoniter.DummyExtension |
| translate func(string) string |
| } |
| |
| func (extension *namingStrategyExtension) UpdateStructDescriptor(structDescriptor *jsoniter.StructDescriptor) { |
| for _, binding := range structDescriptor.Fields { |
| tag, hastag := binding.Field.Tag().Lookup("json") |
| if hastag { |
| tagParts := strings.Split(tag, ",") |
| if tagParts[0] == "-" { |
| continue // hidden field |
| } |
| if tagParts[0] != "" { |
| continue // field explicitly named |
| } |
| } |
| binding.ToNames = []string{extension.translate(binding.Field.Name())} |
| binding.FromNames = []string{extension.translate(binding.Field.Name())} |
| } |
| } |
| |
| // LowerCaseWithUnderscores one strategy to SetNamingStrategy for. It will change HelloWorld to hello_world. |
| func LowerCaseWithUnderscores(name string) string { |
| newName := []rune{} |
| for i, c := range name { |
| if i == 0 { |
| newName = append(newName, unicode.ToLower(c)) |
| } else { |
| if unicode.IsUpper(c) { |
| newName = append(newName, '_') |
| newName = append(newName, unicode.ToLower(c)) |
| } else { |
| newName = append(newName, c) |
| } |
| } |
| } |
| return string(newName) |
| } |