json_conv.go 3.0 KB

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