【GoCN酷Go推薦】GJSON的使用
初心
用最少的口水話把一個(gè)庫,一個(gè)框架的用法講清楚,這才是酷go最有價(jià)值的地方。
丫的就是一社畜,哥老倌兒,你不要在我面前說源碼,你把k8s全部讀了,docker也讀了,你就跑來問我懂不懂,我不要聽,不要聽...
我就是個(gè)碼農(nóng),需要的是咋個(gè)用會(huì)你說的那些東西,需要知道那是個(gè)啥子玩意兒,你開口就是源碼,我用都沒用過聽你講啥子玩意兒?jiǎn)褈
能不能給我一個(gè)Zone,直接給我講用法,不要口水話多,抽象聊原理,我又不好意思去問百度,那些人把一個(gè)人工智能都能吹成妖魔鬼怪,我看了幾萬字,就總結(jié)了一句話:人工智能就是大量數(shù)據(jù)的存儲(chǔ),從而利用各種計(jì)算規(guī)則得出結(jié)果。
酷go到底得不得行嘛,那肯定闊以滿足各位碼農(nóng)(社畜)嘞需求噻,這里邊兒莫得口水話,擼起褲子就是...噢不...擼起袖子直接干代碼的粗人,這里邊兒莫得那么多原理,喜歡看原理的都在最后放了github開源源碼,愛看不看~
酷go里邊兒你可以遇到很多你喜歡的偶像,beego創(chuàng)始人,BAT的大佬等。
Golang | Gjson庫
簡(jiǎn)介 什么是Gjson:
GJSON是一個(gè)Golang包,它提供了一種快速,簡(jiǎn)單的方法來從json格式文檔中獲取值。它擁有比如單行檢索,用"."符號(hào)來尋找路徑,迭代和解析多行json的功能。
個(gè)人理解
Gjson實(shí)際上就是一個(gè)比原生json解析更快更簡(jiǎn)單的一種工具,對(duì)于API來說,我不關(guān)心這個(gè)json格式是否有錯(cuò),我只需要關(guān)心這個(gè)json里面有沒有我想要的數(shù)據(jù),快速格式化成我想要的格式
安裝
GO MOD模式下,執(zhí)行:
$ go get -u github.com/tidwall/gjson
直接獲取值
我還是會(huì)由淺入深的給大家介紹這個(gè)庫的使用方法,如果我們拿到了一個(gè)json字符串的時(shí)候應(yīng)該這樣做:
package main
import (
"fmt"
"github.com/tidwall/gjson"
)
func main() {
exampleJsonString := `{
"code":"000",
"data":{
"all_count":441353,
"lists":[
{
"id":441353,
"job_name":"經(jīng)營(yíng)日?qǐng)?bào)-同步職位信息",
"job_recall_time":"2021-03-13 15:05:04",
"job_recall_content":"請(qǐng)求成功:great",
"create_time":"2021-03-13 15:05:04"
},
{
"id":441352,
"job_name":"經(jīng)營(yíng)日?qǐng)?bào)-Check張繼學(xué)列表",
"job_recall_time":"2021-03-13 15:05:00",
"job_recall_content":"請(qǐng)求成功:OK",
"create_time":"2021-03-13 15:05:00"
}
]
},
"msg":"獲取列表成功",
"success":true
}`
jsonCode := gjson.Get(exampleJsonString, "code") //這個(gè)后面你可以繼續(xù)跟想要的結(jié)果類型,不加的話會(huì)是json字符串的類型
fmt.Println(jsonCode) // 結(jié)果 000
jsonOneJobName := gjson.Get(exampleJsonString,"data.lists.#.job_name").Array() //比如我這里就希望返回是一個(gè)切片類型
fmt.Println(jsonOneJobName) // 結(jié)果 [經(jīng)營(yíng)日?qǐng)?bào)-同步職位信息 經(jīng)營(yíng)日?qǐng)?bào)-Check張繼學(xué)列表]
}
上面的同學(xué)開始疑問了,如果我自己寫錯(cuò)了怎么辦,或者沒有那個(gè)key字段怎么辦,沒關(guān)系,你在獲取到了后,加上自己想要的判斷類型,再判斷一次是否為空即可。
我都不需要定義任何結(jié)構(gòu)體,用最簡(jiǎn)單的辦法獲取到我想要的內(nèi)容
路徑語法的快速概述:
路徑語法的快速概述,以上面json字符串為例
| 路徑 | 結(jié)果 | 解釋 |
|---|---|---|
| data.lists.# | 2 | 獲取當(dāng)前json數(shù)組的長(zhǎng)度 |
| data.lists.1.job_name | 經(jīng)營(yíng)日?qǐng)?bào)-Check張繼學(xué)列表 | 獲取data下lists的索引為1的job_name值 |
| data.lists.#.job_name | [經(jīng)營(yíng)日?qǐng)?bào)-同步職位信息 經(jīng)營(yíng)日?qǐng)?bào)-Check張繼學(xué)列表] | 獲取data下lists下所有的job_name值 |
還有一些路徑通配符,比如你有模糊查詢或者想在json取值時(shí)有判斷的需求,可查看官方文檔:https://github.com/tidwall/gjson
返回函數(shù)
列舉一些常用的返回函數(shù)使用
package main
// ...
// ...
fmt.Println(gjson.Get(exampleJsonString,"data.lists.1.create_time").Exists()) // 查看當(dāng)前路徑的值是否存在 結(jié)果 true
fmt.Println(gjson.Get(exampleJsonString,"data.lists").IsArray()) //查看當(dāng)前路徑是否是json數(shù)組 結(jié)果 true
fmt.Println(gjson.Get(exampleJsonString,"data.lists.0").IsObject()) //查看當(dāng)前路徑是否是一個(gè)json對(duì)象 結(jié)果 true
gjson.Get(exampleJsonString,"data.lists.1").ForEach(func(key, value gjson.Result) bool {
fmt.Println(value)
return true
})
//獲取到路徑結(jié)果后,遍歷取值(其實(shí)覺得自己遍歷可讀性更高)
fmt.Println(gjson.Get(exampleJsonString,"data.lists.1.id").Float()) //所有標(biāo)準(zhǔn)類型都可以獲取到,比如 Bool,Int,Value(這個(gè)是接口類型),Unit,String
直接解析bytes類型
實(shí)際上,很多時(shí)候我們拿到的JSON數(shù)據(jù)都是從API中獲得,比如從http請(qǐng)求中獲得了body,之后ioutil.ReadAll獲得了[]byte類型的數(shù)據(jù)
package main
import (
"fmt"
"github.com/tidwall/gjson"
)
func main() {
exampleJsonByte := []byte(`{
"code":"000",
"data":{
"all_count":441353,
"lists":[
{
"id":441353,
"job_name":"經(jīng)營(yíng)日?qǐng)?bào)-同步職位信息",
"job_recall_time":"2021-03-13 15:05:04",
"job_recall_content":"請(qǐng)求成功:great",
"create_time":"2021-03-13 15:05:04"
},
{
"id":441352,
"job_name":"經(jīng)營(yíng)日?qǐng)?bào)-Check張繼學(xué)列表",
"job_recall_time":"2021-03-13 15:05:00",
"job_recall_content":"請(qǐng)求成功:OK",
"create_time":"2021-03-13 15:05:00"
}
]
},
"msg":"獲取列表成功",
"success":true
}`)
fmt.Println(gjson.GetBytes(exampleJsonByte, "data.lists.#.job_name").Array()) //好吧,結(jié)果一樣 [經(jīng)營(yíng)日?qǐng)?bào)-同步職位信息 經(jīng)營(yíng)日?qǐng)?bào)-Check張繼學(xué)列表]
}
總結(jié)
GJSON真的太簡(jiǎn)單了,可以說是小白golang解析json數(shù)據(jù)的必備良品,如果涉及到多人開發(fā),需要用到同樣的接口結(jié)構(gòu)體,我建議還是老老實(shí)實(shí)的寫結(jié)構(gòu)體,畢竟數(shù)據(jù)模型的搭建是多人協(xié)同開發(fā)基礎(chǔ)之一。
還想了解更多嗎?
更多請(qǐng)查看:https://github.com/tidwall/gjson
歡迎加入我們GOLANG中國社區(qū):https://gocn.vip/
《酷Go推薦》招募:
各位Gopher同學(xué),最近我們社區(qū)打算推出一個(gè)類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個(gè)庫或者好的項(xiàng)目,然后寫一點(diǎn)這個(gè)庫使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到新的庫,并且知道怎么用。
大概規(guī)則和每日新聞?lì)愃疲绻麍?bào)名人多的話每個(gè)人一個(gè)月輪到一次,歡迎大家報(bào)名啊
點(diǎn)擊 閱讀原文 即刻報(bào)名
