Go中JSON解析時(shí)tag的使用
在處理json格式字符串的時(shí)候,經(jīng)常會(huì)看到聲明struct結(jié)構(gòu)的時(shí)候,屬性的右側(cè)還有反引號(hào)括起來(lái)的內(nèi)容。形如:
type User struct {
UserId int `json:"user_id" bson:"user_id"`
UserName string `json:"user_name" bson:"user_name"`
}
struct成員變量標(biāo)簽(Tag)說(shuō)明
要比較詳細(xì)的了解這個(gè),要先了解一下golang的基礎(chǔ),在golang中,命名都是推薦都是用駝峰方式,并且在首字母大小寫(xiě)有特殊的語(yǔ)法含義:包外無(wú)法引用。但是由經(jīng)常需要和其它的系統(tǒng)進(jìn)行數(shù)據(jù)交互,例如轉(zhuǎn)成json格式,存儲(chǔ)到mongodb啊等等。這個(gè)時(shí)候如果用屬性名來(lái)作為鍵值可能不一定會(huì)符合項(xiàng)目要求。
所以呢就多了反引號(hào)的內(nèi)容,在golang中叫標(biāo)簽(Tag),在轉(zhuǎn)換成其它數(shù)據(jù)格式的時(shí)候,會(huì)使用其中特定的字段作為鍵值。例如上例在轉(zhuǎn)成json格式:
u := &User{UserId: 1, UserName: "tony"}
j, _ := json.Marshal(u)
fmt.Println(string(j))
// 輸出內(nèi)容:
// {"user_id":1,"user_name":"tony"}
// 如果在屬性中不增加標(biāo)簽說(shuō)明,則輸出:
// {"UserId":1,"UserName":"tony"}// 可以看到直接用struct的屬性名做鍵值。
// ==其中還有一個(gè)bson的聲明,這個(gè)是用在將數(shù)據(jù)存儲(chǔ)到mongodb使用的==
struct成員變量標(biāo)簽(Tag)獲取
那么當(dāng)我們需要自己封裝一些操作,需要用到Tag中的內(nèi)容時(shí),咋樣去獲取呢?這邊可以使用反射包(reflect)中的方法來(lái)獲?。和暾a如下:
package main
import (
? ? "encoding/json"
? ? "fmt"
? ? "reflect"
)
func main() {
? ? type User struct {
? ? ? ? UserId ? int ? ?`json:"user_id" bson:"user_id"`
? ? ? ? UserName string `json:"user_name" bson:"user_name"`
? ? }
? ? // 輸出json格式
? ? u := &User{UserId: 1, UserName: "tony"}
? ? j, _ := json.Marshal(u)
? ? fmt.Println(string(j))
? ? // 輸出內(nèi)容:{"user_id":1,"user_name":"tony"}
? ? // 獲取tag中的內(nèi)容
? ? t := reflect.TypeOf(u)
? ? field := t.Elem().Field(0)
? ? fmt.Println(field.Tag.Get("json"))
? ? // 輸出:user_id
? ? fmt.Println(field.Tag.Get("bson"))
? ? // 輸出:user_id
}自定義tag
?type User struct {
? ? ?UserId ? int ? ?`json:"user_id" bson:"user_id" test:"test"`
? ? ?UserName string `json:"user_name" bson:"user_name"`
?}獲取tag中test的值
// 獲取tag中的內(nèi)容
typeof := reflect.TypeOf(u)
field := typeof.Elem().Field(0)
fmt.Println(field.Tag.Get("json"))
// 輸出:user_id
fmt.Println(field.Tag.Get("bson"))
// 輸出:user_id
fmt.Println(field.Tag.Get("test"))
// 輸出:test到此這篇關(guān)于Go中JSON解析時(shí)tag的使用的文章就介紹到這了,更多相關(guān)Go JSON tag 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析Go項(xiàng)目中的依賴(lài)包管理與Go?Module常規(guī)操作
這篇文章主要為大家詳細(xì)介紹了Go項(xiàng)目中的依賴(lài)包管理與Go?Module常規(guī)操作,文中的示例代碼講解詳細(xì),對(duì)我們深入了解Go語(yǔ)言有一定的幫助,需要的可以跟隨小編一起學(xué)習(xí)一下2023-10-10
go通過(guò)benchmark對(duì)代碼進(jìn)行性能測(cè)試詳解
在開(kāi)發(fā)中我們要想編寫(xiě)高性能的代碼,或者優(yōu)化代碼的性能時(shí),你首先得知道當(dāng)前代碼的性能,在go中可以使用testing包的benchmark來(lái)做基準(zhǔn)測(cè)試 ,文中有詳細(xì)的代碼示例,感興趣的小伙伴可以參考一下2023-04-04
GoLang?socket網(wǎng)絡(luò)編程傳輸數(shù)據(jù)包時(shí)進(jìn)行長(zhǎng)度校驗(yàn)的方法
在GoLang?socket網(wǎng)絡(luò)編程中,為了確保數(shù)據(jù)交互的穩(wěn)定性和安全性,通常會(huì)通過(guò)傳輸數(shù)據(jù)的長(zhǎng)度進(jìn)行校驗(yàn),發(fā)送端首先發(fā)送數(shù)據(jù)長(zhǎng)度,然后發(fā)送數(shù)據(jù)本體,接收端則根據(jù)接收到的數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)本體進(jìn)行比較,以此來(lái)確認(rèn)數(shù)據(jù)是否傳輸成功2024-11-11
基于golang的簡(jiǎn)單分布式延時(shí)隊(duì)列服務(wù)的實(shí)現(xiàn)
這篇文章主要介紹了基于golang的簡(jiǎn)單分布式延時(shí)隊(duì)列服務(wù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Golang算法之田忌賽馬問(wèn)題實(shí)現(xiàn)方法分析
這篇文章主要介紹了Golang算法之田忌賽馬問(wèn)題實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了基于Go語(yǔ)言的田忌賽馬問(wèn)題原理與算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02
Go 1.22對(duì)net/http包的路由增強(qiáng)功能詳解
Go 1.22 版本對(duì) net/http 包的路由功能進(jìn)行了增強(qiáng),引入了方法匹配(method matching)和通配符(wildcards)兩項(xiàng)新功能,本文將給大家詳細(xì)的介紹一下Go 1.22對(duì)net/http包的路由增強(qiáng)功能,需要的朋友可以參考下2024-02-02
Golang?流水線設(shè)計(jì)模式實(shí)踐示例詳解
這篇文章主要為大家介紹了Golang?流水線設(shè)計(jì)模式實(shí)踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

