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)文章
一文搞懂Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)strconv
strconv包實(shí)現(xiàn)了基本數(shù)據(jù)類(lèi)型和其字符串表示的相互轉(zhuǎn)換,本文主要介紹Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)strconv,想要學(xué)習(xí)strconv標(biāo)準(zhǔn)庫(kù)的可以了解一下2023-04-04
利用golang進(jìn)行OpenCV學(xué)習(xí)和開(kāi)發(fā)的步驟
目前,OpenCV逐步成為一個(gè)通用的基礎(chǔ)研究和產(chǎn)品開(kāi)發(fā)平臺(tái),下面這篇文章主要給大家介紹了關(guān)于利用golang進(jìn)行OpenCV學(xué)習(xí)和開(kāi)發(fā)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09
Go語(yǔ)言開(kāi)發(fā)編程規(guī)范命令風(fēng)格代碼格式
這篇文章主要為大家介紹了Go語(yǔ)言開(kāi)發(fā)編程規(guī)范命令風(fēng)格代碼格式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Go中Gzip與json搭配實(shí)現(xiàn)數(shù)據(jù)壓縮demo
這篇文章主要為大家介紹了Go中Gzip與json搭配使用壓縮數(shù)據(jù)的實(shí)現(xiàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
go?doudou開(kāi)發(fā)單體RESTful服務(wù)快速上手教程
這篇文章主要為大家介紹了go?doudou開(kāi)發(fā)單體RESTful服務(wù)快速上手教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Golang實(shí)現(xiàn)簡(jiǎn)易的命令行功能
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Golang實(shí)現(xiàn)一個(gè)簡(jiǎn)易的命令行功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-02-02

