naming_strategy.go 996 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package extra
  2. import (
  3. "github.com/json-iterator/go"
  4. "unicode"
  5. )
  6. func SetNamingStrategy(translate func(string) string) {
  7. jsoniter.RegisterExtension(&namingStrategyExtension{jsoniter.DummyExtension{}, translate})
  8. }
  9. type namingStrategyExtension struct {
  10. jsoniter.DummyExtension
  11. translate func(string) string
  12. }
  13. func (extension *namingStrategyExtension) UpdateStructDescriptor(structDescriptor *jsoniter.StructDescriptor) {
  14. for _, binding := range structDescriptor.Fields {
  15. binding.ToNames = []string{extension.translate(binding.Field.Name)}
  16. binding.FromNames = []string{extension.translate(binding.Field.Name)}
  17. }
  18. }
  19. func LowerCaseWithUnderscores(name string) string {
  20. newName := []rune{}
  21. for i, c := range name {
  22. if i == 0 {
  23. newName = append(newName, unicode.ToLower(c))
  24. } else {
  25. if unicode.IsUpper(c) {
  26. newName = append(newName, '_')
  27. newName = append(newName, unicode.ToLower(c))
  28. } else {
  29. newName = append(newName, c)
  30. }
  31. }
  32. }
  33. return string(newName)
  34. }