naming_strategy.go 1.1 KB

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