|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- package tool
-
- import (
- "bytes"
- "encoding/json"
- "log"
- "regexp"
- "strconv"
- "strings"
- "unicode"
- )
-
- /*************************************** 下划线json ***************************************/
- type JsonSnakeCase struct {
- Value interface{}
- }
-
- func MarshalJSON(marshalJson []byte) []byte {
- // Regexp definitions
- var keyMatchRegex = regexp.MustCompile(`\"(\w+)\":`)
- var wordBarrierRegex = regexp.MustCompile(`(\w)([A-Z])`)
- converted := keyMatchRegex.ReplaceAllFunc(
- marshalJson,
- func(match []byte) []byte {
- return bytes.ToLower(wordBarrierRegex.ReplaceAll(
- match,
- []byte(`${1}_${2}`),
- ))
- },
- )
- return converted
- }
-
- /*************************************** 驼峰json ***************************************/
- type JsonCamelCase struct {
- Value interface{}
- }
-
- func (c JsonCamelCase) MarshalJSON() ([]byte, error) {
- var keyMatchRegex = regexp.MustCompile(`\"(\w+)\":`)
- marshalled, err := json.Marshal(c.Value)
- converted := keyMatchRegex.ReplaceAllFunc(
- marshalled,
- func(match []byte) []byte {
- matchStr := string(match)
- key := matchStr[1 : len(matchStr)-2]
- resKey := Lcfirst(Case2Camel(key))
- return []byte(`"` + resKey + `":`)
- },
- )
- return converted, err
- }
-
- /*************************************** 其他方法 ***************************************/
- // 驼峰式写法转为下划线写法
- func Camel2Case(name string) string {
- buffer := NewBuffer()
- for i, r := range name {
- if unicode.IsUpper(r) {
- if i != 0 {
- buffer.Append('_')
- }
- buffer.Append(unicode.ToLower(r))
- } else {
- buffer.Append(r)
- }
- }
- return buffer.String()
- }
-
- // 下划线写法转为驼峰写法
- func Case2Camel(name string) string {
- name = strings.Replace(name, "_", " ", -1)
- name = strings.Title(name)
- return strings.Replace(name, " ", "", -1)
- }
-
- // 首字母大写
- func Ucfirst(str string) string {
- for i, v := range str {
- return string(unicode.ToUpper(v)) + str[i+1:]
- }
- return ""
- }
-
- // 首字母小写
- func Lcfirst(str string) string {
- for i, v := range str {
- return string(unicode.ToLower(v)) + str[i+1:]
- }
- return ""
- }
-
- // 内嵌bytes.Buffer,支持连写
- type Buffer struct {
- *bytes.Buffer
- }
-
- func NewBuffer() *Buffer {
- return &Buffer{Buffer: new(bytes.Buffer)}
- }
-
- func (b *Buffer) Append(i interface{}) *Buffer {
- switch val := i.(type) {
- case int:
- b.append(strconv.Itoa(val))
- case int64:
- b.append(strconv.FormatInt(val, 10))
- case uint:
- b.append(strconv.FormatUint(uint64(val), 10))
- case uint64:
- b.append(strconv.FormatUint(val, 10))
- case string:
- b.append(val)
- case []byte:
- b.Write(val)
- case rune:
- b.WriteRune(val)
- }
- return b
- }
-
- func (b *Buffer) append(s string) *Buffer {
- defer func() {
- if err := recover(); err != nil {
- log.Println("*****内存不够了!******")
- }
- }()
- b.WriteString(s)
- return b
- }
|