Go中JSON解析時tag的使用
在處理json格式字符串的時候,經(jīng)常會看到聲明struct結(jié)構(gòu)的時候,屬性的右側(cè)還有反引號括起來的內(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)說明
要比較詳細(xì)的了解這個,要先了解一下golang的基礎(chǔ),在golang中,命名都是推薦都是用駝峰方式,并且在首字母大小寫有特殊的語法含義:包外無法引用。但是由經(jīng)常需要和其它的系統(tǒng)進(jìn)行數(shù)據(jù)交互,例如轉(zhuǎn)成json格式,存儲到mongodb啊等等。這個時候如果用屬性名來作為鍵值可能不一定會符合項目要求。
所以呢就多了反引號的內(nèi)容,在golang中叫標(biāo)簽(Tag),在轉(zhuǎn)換成其它數(shù)據(jù)格式的時候,會使用其中特定的字段作為鍵值。例如上例在轉(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)簽說明,則輸出:
// {"UserId":1,"UserName":"tony"}// 可以看到直接用struct的屬性名做鍵值。
// ==其中還有一個bson的聲明,這個是用在將數(shù)據(jù)存儲到mongodb使用的==
struct成員變量標(biāo)簽(Tag)獲取
那么當(dāng)我們需要自己封裝一些操作,需要用到Tag中的內(nèi)容時,咋樣去獲取呢?這邊可以使用反射包(reflect)中的方法來獲?。和暾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解析時tag的使用的文章就介紹到這了,更多相關(guān)Go JSON tag 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析Go項目中的依賴包管理與Go?Module常規(guī)操作
這篇文章主要為大家詳細(xì)介紹了Go項目中的依賴包管理與Go?Module常規(guī)操作,文中的示例代碼講解詳細(xì),對我們深入了解Go語言有一定的幫助,需要的可以跟隨小編一起學(xué)習(xí)一下2023-10-10
GoLang?socket網(wǎng)絡(luò)編程傳輸數(shù)據(jù)包時進(jìn)行長度校驗的方法
在GoLang?socket網(wǎng)絡(luò)編程中,為了確保數(shù)據(jù)交互的穩(wěn)定性和安全性,通常會通過傳輸數(shù)據(jù)的長度進(jìn)行校驗,發(fā)送端首先發(fā)送數(shù)據(jù)長度,然后發(fā)送數(shù)據(jù)本體,接收端則根據(jù)接收到的數(shù)據(jù)長度和數(shù)據(jù)本體進(jìn)行比較,以此來確認(rèn)數(shù)據(jù)是否傳輸成功2024-11-11
基于golang的簡單分布式延時隊列服務(wù)的實現(xiàn)
這篇文章主要介紹了基于golang的簡單分布式延時隊列服務(wù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Go 1.22對net/http包的路由增強(qiáng)功能詳解
Go 1.22 版本對 net/http 包的路由功能進(jìn)行了增強(qiáng),引入了方法匹配(method matching)和通配符(wildcards)兩項新功能,本文將給大家詳細(xì)的介紹一下Go 1.22對net/http包的路由增強(qiáng)功能,需要的朋友可以參考下2024-02-02

