JsonSnakeCase.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. package utils
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "log"
  6. "regexp"
  7. "strconv"
  8. "strings"
  9. "unicode"
  10. )
  11. /*************************************** 下划线json ***************************************/
  12. type JsonSnakeCase struct {
  13. Value interface{}
  14. }
  15. func (c JsonSnakeCase) MarshalJSON() ([]byte, error) {
  16. // Regexp definitions
  17. var keyMatchRegex = regexp.MustCompile(`\"(\w+)\":`)
  18. var wordBarrierRegex = regexp.MustCompile(`(\w)([A-Z])`)
  19. marshalled, err := json.Marshal(c.Value)
  20. converted := keyMatchRegex.ReplaceAllFunc(
  21. marshalled,
  22. func(match []byte) []byte {
  23. return bytes.ToLower(wordBarrierRegex.ReplaceAll(
  24. match,
  25. []byte(`${1}_${2}`),
  26. ))
  27. },
  28. )
  29. return converted, err
  30. }
  31. /*************************************** 驼峰json ***************************************/
  32. type JsonCamelCase struct {
  33. Value interface{}
  34. }
  35. func (c JsonCamelCase) MarshalJSON() ([]byte, error) {
  36. var keyMatchRegex = regexp.MustCompile(`\"(\w+)\":`)
  37. marshalled, err := json.Marshal(c.Value)
  38. converted := keyMatchRegex.ReplaceAllFunc(
  39. marshalled,
  40. func(match []byte) []byte {
  41. matchStr := string(match)
  42. key := matchStr[1 : len(matchStr)-2]
  43. resKey := Lcfirst(Case2Camel(key))
  44. return []byte(`"` + resKey + `":`)
  45. },
  46. )
  47. return converted, err
  48. }
  49. /*************************************** 其他方法 ***************************************/
  50. // 驼峰式写法转为下划线写法
  51. func Camel2Case(name string) string {
  52. buffer := NewBuffer()
  53. for i, r := range name {
  54. if unicode.IsUpper(r) {
  55. if i != 0 {
  56. buffer.Append('_')
  57. }
  58. buffer.Append(unicode.ToLower(r))
  59. } else {
  60. buffer.Append(r)
  61. }
  62. }
  63. return buffer.String()
  64. }
  65. // 驼峰式写法转为中划线写法
  66. func Camel2Middle(name string) string {
  67. buffer := NewBuffer()
  68. for i, r := range name {
  69. if unicode.IsUpper(r) {
  70. if i != 0 {
  71. buffer.Append('-')
  72. }
  73. buffer.Append(unicode.ToLower(r))
  74. } else {
  75. buffer.Append(r)
  76. }
  77. }
  78. return buffer.String()
  79. }
  80. // 下划线写法转为驼峰写法
  81. func Case2Camel(name string) string {
  82. name = strings.Replace(name, "_", " ", -1)
  83. name = strings.Title(name)
  84. return strings.Replace(name, " ", "", -1)
  85. }
  86. // 首字母大写
  87. func Ucfirst(str string) string {
  88. for i, v := range str {
  89. return string(unicode.ToUpper(v)) + str[i+1:]
  90. }
  91. return ""
  92. }
  93. // 首字母小写
  94. func Lcfirst(str string) string {
  95. for i, v := range str {
  96. return string(unicode.ToLower(v)) + str[i+1:]
  97. }
  98. return ""
  99. }
  100. // 内嵌bytes.Buffer,支持连写
  101. type Buffer struct {
  102. *bytes.Buffer
  103. }
  104. func NewBuffer() *Buffer {
  105. return &Buffer{Buffer: new(bytes.Buffer)}
  106. }
  107. func (b *Buffer) Append(i interface{}) *Buffer {
  108. switch val := i.(type) {
  109. case int:
  110. b.append(strconv.Itoa(val))
  111. case int64:
  112. b.append(strconv.FormatInt(val, 10))
  113. case uint:
  114. b.append(strconv.FormatUint(uint64(val), 10))
  115. case uint64:
  116. b.append(strconv.FormatUint(val, 10))
  117. case string:
  118. b.append(val)
  119. case []byte:
  120. b.Write(val)
  121. case rune:
  122. b.WriteRune(val)
  123. }
  124. return b
  125. }
  126. func (b *Buffer) append(s string) *Buffer {
  127. defer func() {
  128. if err := recover(); err != nil {
  129. log.Println("*****内存不够了!******")
  130. }
  131. }()
  132. b.WriteString(s)
  133. return b
  134. }