一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

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

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

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

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

一、需求

golang默認(rèn)的結(jié)構(gòu)體json轉(zhuǎn)碼出來(lái),都是根據(jù)字段名生成的大寫駝峰格式,但是一般我們最常用的json格式是小寫駝峰或者小寫下劃線,因此,我們非常需要一個(gè)統(tǒng)一的方法去轉(zhuǎn)換,而不想挨個(gè)寫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)
}

運(yùn)行結(jié)果

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

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

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

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

二、實(shí)現(xiàn)

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

實(shí)現(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的對(duì)象即可

?
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語(yǔ)言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Go 駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

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

延伸 · 閱讀

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

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

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

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

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

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

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

    golang 通過(guò)ssh代理連接mysql的操作

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

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

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

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

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

    golang如何使用struct的tag屬性的詳細(xì)介紹

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

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

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

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

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

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

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

    天易獨(dú)尊11682021-06-09
  • Golanggo語(yǔ)言制作端口掃描器

    go語(yǔ)言制作端口掃描器

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

    腳本之家3642020-04-25
主站蜘蛛池模板: 99视频精品国在线视频艾草 | 青青草原国产视频 | 国产卡一卡二卡3卡乱码免费 | 天天做日日做 | 男人猛激烈吃奶gif动态图 | 美女被的在线网站91 | 人体做爰aaaa免费 | 513热点网深夜影院影院诶 | 欧美特黄三级在线观看 | a级毛片毛片免费很很综合 a级黄色视屏 | 咪咪爱小说 | www.天天操 | 日韩精品视频在线观看免费 | 欧美综合亚洲图片综合区 | 国产 国语对白 露脸正在播放 | 亚洲人成绝费网站色ww | 97国产蝌蚪视频在线观看 | 国产欧美日韩精品高清二区综合区 | 3d动漫美女被吸乳羞羞有 | 国产精品29页 | 欧美日韩精品一区二区三区视频 | 国产精品亚洲w码日韩中文 国产精品香蕉在线观看不卡 | 国产精品天天影视久久综合网 | ai换脸杨颖啪啪免费网站 | 九九热在线视频观看这里只有精品 | 成人精品福利 | 免费看又黄又爽又猛的视频软件- | 插入逼 | 激情影院免费 | 好大好猛好爽好深视频免费 | 糖心在线观看网 | 99视频一区 | 久久精品国产亚洲AV蜜臀 | 国产在线精品成人一区二区三区 | 欧美日韩亚洲国内综合网俺 | 亚洲欧美日韩中文字幕网址 | 色综合视频在线观看 | 国产成人精品一区二区阿娇陈冠希 | 不卡一区二区三区 | 精品综合久久久久久8888 | 女教师波多野结衣高清在线 |