激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Golang - Go語言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實現(xiàn)

Go語言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實現(xiàn)

2020-07-16 11:12雪山飛豬 Golang

這篇文章主要介紹了Go語言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、需求

golang默認的結(jié)構(gòu)體json轉(zhuǎn)碼出來,都是根據(jù)字段名生成的大寫駝峰格式,但是一般我們最常用的json格式是小寫駝峰或者小寫下劃線,因此,我們非常需要一個統(tǒng)一的方法去轉(zhuǎn)換,而不想挨個寫json標(biāo)簽,例如

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main
 
import (
 "encoding/json"
 "fmt"
)
 
func main() {
 type Person struct {
 HelloWold    string
 LightWeightBaby string
 }
 var a = Person{HelloWold: "chenqionghe", LightWeightBaby: "muscle"}
 res, _ := json.Marshal(a)
 fmt.Printf("%s", res)
}

運行結(jié)果

{"HelloWold":"chenqionghe","LightWeightBaby":"muscle"}

輸出來的json結(jié)構(gòu)是大寫駝峰的,肯定非常別扭的,當(dāng)然 ,我們通過設(shè)定json標(biāo)簽來設(shè)定輸出的json字段名,例如

?
1
2
3
4
type Person struct {
 HelloWold    string `json:"hello_wold"`
 LightWeightBaby string `json:"light_weight_baby"`
}

但是如果字段特別多,需要挨個設(shè)置也太麻煩了。

二、實現(xiàn)

Golang 的標(biāo)準(zhǔn) Json 在處理各種數(shù)據(jù)類型是都是調(diào)用其類型接口UnmarshalJSON解碼和MarshalJSON編碼進行轉(zhuǎn)換的,所以我們可以封裝一個統(tǒng)一轉(zhuǎn)換下劃線的json結(jié)構(gòu)體或統(tǒng)一轉(zhuǎn)換駝峰的json結(jié)構(gòu)體,并實現(xiàn)MarshalJSON方法,就可以達到目的。

實現(xiàn)如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package jsonconv
 
import (
 "bytes"
 "encoding/json"
 "log"
 "regexp"
 "strconv"
 "strings"
 "unicode"
)
 
/*************************************** 下劃線json ***************************************/
type JsonSnakeCase struct {
 Value interface{}
}
 
func (c JsonSnakeCase) MarshalJSON() ([]byte, error) {
 // Regexp definitions
 var keyMatchRegex = regexp.MustCompile(`\"(\w+)\":`)
 var wordBarrierRegex = regexp.MustCompile(`(\w)([A-Z])`)
 marshalled, err := json.Marshal(c.Value)
 converted := keyMatchRegex.ReplaceAllFunc(
 marshalled,
 func(match []byte) []byte {
  return bytes.ToLower(wordBarrierRegex.ReplaceAll(
  match,
  []byte(`${1}_${2}`),
  ))
 },
 )
 return converted, err
}
 
/*************************************** 駝峰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
}
 
/*************************************** 其他方法 ***************************************/
// 駝峰式寫法轉(zhuǎn)為下劃線寫法
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()
}
 
// 下劃線寫法轉(zhuǎn)為駝峰寫法
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 ""
}
 
// 內(nèi)嵌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("*****內(nèi)存不夠了!******")
 }
 }()
 b.WriteString(s)
 return b
}

三、使用

JsonSnakeCase統(tǒng)一轉(zhuǎn)下劃線json

使用jsonconv.JsonSnakeCase包裹一下要輸出json的對象即可

?
1
2
3
4
5
6
7
8
9
func main() {
 type Person struct {
 HelloWold    string
 LightWeightBaby string
 }
 var a = Person{HelloWold: "chenqionghe", LightWeightBaby: "muscle"}
 res, _ := json.Marshal(jsonconv.JsonSnakeCase{a})
 fmt.Printf("%s", res)
}

輸出如下

{"hello_wold":"chenqionghe","light_weight_baby":"muscle"}

JsonCamelCase統(tǒng)一轉(zhuǎn)駝峰json

已經(jīng)指定了下劃線標(biāo)簽的結(jié)構(gòu)體,我們也可以統(tǒng)一轉(zhuǎn)為駝峰的json

?
1
2
3
4
5
6
7
8
9
func main() {
 type Person struct {
 HelloWold    string `json:"hello_wold"`
 LightWeightBaby string `json:"light_weight_baby"`
 }
 var a = Person{HelloWold: "chenqionghe", LightWeightBaby: "muscle"}
 res, _ := json.Marshal(jsonconv.JsonCamelCase{a})
 fmt.Printf("%s", res)
}

輸出如下

{"helloWold":"chenqionghe","lightWeightBaby":"muscle"}

非常方便的解決了json統(tǒng)一轉(zhuǎn)碼格式的需求

到此這篇關(guān)于Go語言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實現(xiàn)的文章就介紹到這了,更多相關(guān)Go 駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/chenqionghe/p/13067596.html

延伸 · 閱讀

精彩推薦
  • Golanggo日志系統(tǒng)logrus顯示文件和行號的操作

    go日志系統(tǒng)logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統(tǒng)logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggolang的httpserver優(yōu)雅重啟方法詳解

    golang的httpserver優(yōu)雅重啟方法詳解

    這篇文章主要給大家介紹了關(guān)于golang的httpserver優(yōu)雅重啟的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,...

    helight2992020-05-14
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網(wǎng)11352020-05-21
  • GolangGolang通脈之?dāng)?shù)據(jù)類型詳情

    Golang通脈之?dāng)?shù)據(jù)類型詳情

    這篇文章主要介紹了Golang通脈之?dāng)?shù)據(jù)類型,在編程語言中標(biāo)識符就是定義的具有某種意義的詞,比如變量名、常量名、函數(shù)名等等,Go語言中標(biāo)識符允許由...

    4272021-11-24
  • GolangGolang中Bit數(shù)組的實現(xiàn)方式

    Golang中Bit數(shù)組的實現(xiàn)方式

    這篇文章主要介紹了Golang中Bit數(shù)組的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
主站蜘蛛池模板: 成人福利视频在线 | 日本精品免费观看 | 国产精品久久久久久久久岛 | 久久精品一区二区三区国产主播 | wwwxxx视频 | 国产九九在线视频 | 九九看片| 国产色片 | av手机在线免费播放 | 国产精品久久久久久久久久东京 | 91在线免费观看 | 欧美18—19sex性hd按摩 | 欧美一级黄色录像片 | 国产精品99久久久久久宅女 | 91免费版在线观看 | 日本羞羞的午夜电视剧 | 久久不射电影网 | 欧美亚洲国产日韩 | 九九热国产视频 | 蜜桃传免费看片www 日本一区二区三区视频在线 | 欧美日韩免费看 | 成人在线激情视频 | 成人在线免费观看小视频 | 国产美女三级做爰 | 黄色视屏免费在线观看 | 在线视频国产一区 | 国产成人在线网站 | 国产黄色一级大片 | 欧美特黄视频 | 国内精品伊人久久 | 高清国产午夜精品久久久久久 | 亚洲影院久久久av天天蜜桃臀 | 国产二区三区四区 | 曰批全过程120分钟免费69 | 黄色毛片视频在线观看 | 依人网站| 黄色一级片免费在线观看 | 男男羞羞视频网站国产 | 亚洲电影免费观看国语版 | mmmwww| 日日操夜夜透 |