Go?語(yǔ)言?json解析框架與?gjson?詳解
前言:
JSON 解析是我們不可避免的常見(jiàn)問(wèn)題,在 Go 語(yǔ)言中,我們可以借助 gjson 庫(kù)來(lái)方便的進(jìn)行 json 屬性的提取與解析,本文和大家一起上手與梳理 gjson 庫(kù)的使用。
1. 快速使用
快速安裝:
go get github.com/tidwall/gjson
Get() 方法解析 json 字符串:
json := `{"name":{"first":"uncle","last":"suta"}}`
lastName := gjson.Get(json, "name.last")
fmt.Println(lastName.String()) // "uncle"通過(guò)上面的例子,我們可以看到,使用 gjson 中的 Get() 方法,我們可以輕松愉快的進(jìn)行 json 解析。
2. Get() 返回的 Result 結(jié)構(gòu)體
Get() 方法在解析完 json 字符串后,返回的是一個(gè) Result 結(jié)構(gòu)體,其結(jié)構(gòu)如下所示:
// Result represents a json value that is returned from Get().
type Result struct {
// Type is the json type
Type Type
// Raw is the raw json
Raw string
// Str is the json string
Str string
// Num is the json number
Num float64
// Index of raw value in original json, zero means index unknown
Index int
// Indexes of all the elements that match on a path containing the '#'
// query character.
Indexes []int
}但是,我們解析 json 所需要的往往是基本數(shù)據(jù)類(lèi)型,因此,Result 結(jié)構(gòu)體本身為我們實(shí)現(xiàn)了如下所示的豐富的方法來(lái)進(jìn)行類(lèi)型轉(zhuǎn)化:
String() string
Bool() bool
Int() int64
Uint() uint64
Float() float64
Time() time.Time
Array() []Result
IsObject() bool
IsArray() bool
ForEach(iterator func(key Result, value Result) bool)
Map() map[string]Result
Get(path string) Result
arrayOrMap(vc byte, valueize bool) (r arrayOrMapResult)
Exists() bool
Value() interface{}
Less(token Result, caseSensitive bool) bool
Paths(json string) []string
Path(json string) string3. 鍵路徑
在 gjson 中,鍵路徑實(shí)際上是以.分隔的一系列鍵。
gjson支持在鍵中包含通配符*和?,*匹配任意多個(gè)字符,?匹配單個(gè)字符。 例如abc*可以匹配abc1111/abc222/abc...等以abc開(kāi)頭的鍵,ab?只能匹配ab1/ab2等以ab開(kāi)頭且后面只有一個(gè)字符的鍵。
數(shù)組使用鍵名 + . + 索引(索引從 0 開(kāi)始)的方式讀取元素,如果鍵a對(duì)應(yīng)的值是一個(gè)數(shù)組,那么a.0讀取數(shù)組的第一個(gè)元素,a.1讀取第二個(gè)元素。
數(shù)組長(zhǎng)度使用鍵名 + . + #獲取,例如a.#返回?cái)?shù)組a的長(zhǎng)度。
如果鍵名中出現(xiàn).,那么需要使用\進(jìn)行轉(zhuǎn)義。
4. json 數(shù)組遍歷
gjson還提供了通用的遍歷數(shù)組和對(duì)象的方式。gjson.Get()方法返回一個(gè)gjson.Result類(lèi)型的對(duì)象,json.Result提供了ForEach()方法用于遍歷。該方法接受一個(gè)類(lèi)型為func (key, value gjson.Result) bool的回調(diào)函數(shù)。遍歷對(duì)象時(shí)key和value分別為對(duì)象的鍵和值;遍歷數(shù)組時(shí),value為數(shù)組元素,key為空(不是索引)?;卣{(diào)返回false時(shí),遍歷停止:
json := `{"list": ["a", "b", "c"]}`
list := gjson.Get(json, "list")
list.ForEach(func(_, element gjson.Result) bool {
fmt.Println(element)
return true
})5. 其他
gjson.Valid() 可以對(duì) json 字符串的合法性進(jìn)行校驗(yàn)。
gjson.GetMany() 可以一次解析多個(gè)字段。
到此這篇關(guān)于Go 語(yǔ)言 json解析框架與 gjson 詳解的文章就介紹到這了,更多相關(guān)Go json 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Go與Rust高性能解析JSON實(shí)現(xiàn)方法示例
- golang解析json數(shù)據(jù)的4種方法總結(jié)
- Golang解析JSON遇到的坑及解決方法
- Go語(yǔ)言學(xué)習(xí)之JSON編碼解析與使用
- Go語(yǔ)言實(shí)現(xiàn)JSON解析的神器詳解
- 一文帶你了解Go語(yǔ)言如何解析JSON
- Go語(yǔ)言JSON解析器gjson使用方法詳解
- Golang實(shí)現(xiàn)解析JSON的三種方法總結(jié)
- golang生成JSON以及解析JSON
- go語(yǔ)言用八百行代碼實(shí)現(xiàn)一個(gè)JSON解析器
- Go語(yǔ)言實(shí)現(xiàn)JSON解析的方法詳解
- GO中Json解析的幾種方式
相關(guān)文章
Golang實(shí)現(xiàn)Java虛擬機(jī)之解析class文件詳解
這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)Java虛擬機(jī)之解析class文件的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例
這篇文章主要為大家介紹了Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Golang中urlencode與urldecode編碼解碼詳解
這篇文章主要給大家介紹了關(guān)于Golang中urlencode與urldecode編碼解碼的相關(guān)資料,在Go語(yǔ)言中轉(zhuǎn)碼操作非常方便,可以使用內(nèi)置的encoding包來(lái)快速完成轉(zhuǎn)碼操作,Go語(yǔ)言中的encoding包提供了許多常用的編碼解碼方式,需要的朋友可以參考下2023-09-09
golang實(shí)現(xiàn)各種情況的get請(qǐng)求操作
這篇文章主要介紹了golang實(shí)現(xiàn)各種情況的get請(qǐng)求操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
使用client-go工具調(diào)用kubernetes API接口的教程詳解(v1.17版本)
這篇文章主要介紹了使用client-go工具調(diào)kubernetes API接口(v1.17版本),本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Go語(yǔ)言使用Redis和Etcd實(shí)現(xiàn)高性能分布式鎖
這篇文章主要為大家介紹了Go語(yǔ)言使用Redis實(shí)現(xiàn)高性能分布式鎖示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Goland使用delve進(jìn)行遠(yuǎn)程調(diào)試的詳細(xì)教程
網(wǎng)上給出的使用delve進(jìn)行遠(yuǎn)程調(diào)試,都需要先在本地交叉編譯或者在遠(yuǎn)程主機(jī)上編譯出可運(yùn)行的程序,然后再用delve在遠(yuǎn)程啟動(dòng)程序,本教程會(huì)將上面的步驟簡(jiǎn)化為只需要兩步,1,在遠(yuǎn)程運(yùn)行程序2,在本地啟動(dòng)調(diào)試,需要的朋友可以參考下2024-08-08
記一次go語(yǔ)言使用time.Duration類(lèi)型踩過(guò)的坑
本文主要介紹了記一次go語(yǔ)言使用time.Duration類(lèi)型踩過(guò)的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

