版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第Go中使用gjson來操作JSON數(shù)據(jù)的實現(xiàn)目錄獲取值路徑解析JSON行ResultType64-bitintegers讀取嵌套數(shù)組對象或數(shù)組迭代簡易的Parse和Get檢查value是否存在驗證JSON反序列化到map一次獲取多個值項目地址:/tidwall/gjson
下載:
$goget-u/tidwall/gjson
獲取值
Get查詢指定路徑,通過.來區(qū)分.比如name.last或者age.如果找到了匹配路徑,將返回結(jié)果.
packagemain
import"/tidwall/gjson"
constjson=`{"name":{"first":"Janet","last":"Prichard"},"age":47}`
funcmain(){
value:=gjson.Get(json,"name.last")
println(value.String())
輸出結(jié)果:
Prichard
同時有GetMany方法批量獲取值,也有GetBytes方法獲取字節(jié)切片.
路徑解析
路徑是一系列被.分隔的key拼接而成.路徑可能包含通配符*和.通過下標訪問數(shù)組值.通過#來獲取值在元素中的排位或訪問子路徑..和通配符可以通過來轉(zhuǎn)義.
{
"name":{"first":"Tom","last":"Anderson"},
"age":37,
"children":["Sara","Alex","Jack"],
"fav.movie":"DeerHunter",
"friends":[
{"first":"Dale","last":"Murphy","age":44},
{"first":"Roger","last":"Craig","age":68},
{"first":"Jane","last":"Murphy","age":47}
"name.last""Anderson"
"age"37
"children"["Sara","Alex","Jack"]
"children.#"3
"children.1""Alex"
"child*.2""Jack"
"cildren.0""Sara"
"fav\.movie""DeerHunter"
"friends.#.first"["Dale","Roger","Jane"]
"friends.1.last""Craig"
你同樣能通過#[...]來查詢數(shù)組中的第一個匹配的項,或通過#[...]#查詢所有匹配的項.查詢支持==,!=,,=,,=比較運算符和%模糊匹配.
friends.#[last=="Murphy"].first"Dale"
friends.#[last=="Murphy"]#.first["Dale","Jane"]
friends.#[age45]#.last["Craig","Murphy"]
friends.#[first%"D*"].last"Murphy"
JSON行
同樣支持JSONLines,使用..前綴,把多行文檔視作數(shù)組.比如:
{"name":"Gilbert","age":61}
{"name":"Alexa","age":34}
{"name":"May","age":57}
{"name":"Deloise","age":44}
..#4
..1{"name":"Alexa","age":34}
..3{"name":"Deloise","age":44}
..#.name["Gilbert","Alexa","May","Deloise"]
..#[name="May"].age57
ForEachLines方法可以迭代json.
gjson.ForEachLine(json,func(linegjson.Result)bool{
println(line.String())
returntrue
ResultType
GJSON支持json類型包括string,number,bool,andnull.數(shù)組和對象被擋住基礎(chǔ)類型返回.Result持有如下其中一種類型:
bool,forJSONbooleans
float64,forJSONnumbers
string,forJSONstringliterals
nil,forJSONnull
直接訪問value:
result.Type//canbeString,Number,True,False,Null,orJSON
result.Str//holdsthestring
result.Num//holdsthefloat64number
result.Raw//holdstherawjson
result.Index//indexofrawvalueinoriginaljson,zeromeansindexunknown
有各種各樣的方便的函數(shù)可以獲取結(jié)果:
result.Exists()bool
result.Value()interface{}
result.Int()int64
result.Uint()uint64
result.Float()float64
result.String()string
result.Bool()bool
result.Time()time.Time
result.Array()[]gjson.Result
result.Map()map[string]gjson.Result
result.Get(pathstring)Result
result.ForEach(iteratorfunc(key,valueResult)bool)
result.Less(tokenResult,caseSensitivebool)bool
result.Value()方法返回interface{}Go基本類型之一.result.Array()方法返回一組值.如果結(jié)果是不存在的值,將會返回空數(shù)組.如果結(jié)果不是JSON數(shù)組,將會返回只包含一個值的數(shù)組.
booleanbool
numberfloat64
stringstring
nullnil
array[]interface{}
objectmap[string]interface{}
64-bitintegers
result.Int()和result.Uint()返回的是64位大數(shù)字.
result.Int()int64//-9223372036854775808to9223372036854775807
result.Uint()int64//0to18446744073709551615
讀取嵌套數(shù)組
假如你想從下列json獲取所有的lastName:
{
"programmers":[
"firstName":"Janet",
"lastName":"McLaughlin",
},{
"firstName":"Elliotte",
"lastName":"Hunter",
},{
"firstName":"Jason",
"lastName":"Harold",
你可以使用如下路徑programmers.#.lastName:
result:=gjson.Get(json,"programmers.#.lastName")
for_,name:=rangeresult.Array(){
println(name.String())
你同樣能獲取數(shù)組里的對象:
name:=gjson.Get(json,`programmers.#[lastName="Hunter"].firstName`)
println(name.String())//prints"Elliotte"
對象或數(shù)組迭代
ForEach方法允許你快速的迭代對象或數(shù)組.key和value被傳遞給對象的迭代器函數(shù).只有value被傳遞給數(shù)組.迭代器返回false將會終止迭代.
簡易的Parse和Get
Parse(json)方法可以簡單的分析json,result.Get(path)查詢結(jié)果.比如,下面的幾種情況都將返回相同的結(jié)果:
gjson.Parse(json).Get("name").Get("last")
gjson.Get(json,"name").Get("last")
gjson.Get(json,"name.last")
檢查value是否存在
有時你想要知道值是否存在.
value:=gjson.Get(json,"name.last")
if!value.Exists(){
println("nolastname")
}else{
println(value.String())
//Orasonestep
ifgjson.Get(json,"name.last").Exists(){
println("hasalastname")
驗證JSON
Get*和Parse*方法預(yù)期json格式是正常的,如果不正常,將會返回不可預(yù)料的結(jié)果.如果你讀取的json來源不可預(yù)料,那么你可以通過GJSON這么事先驗證.
if!gjson.Valid(json){
returnerrors.New("invalidjson")
value:=gjson.Get(json,"name.last")
反序列化到map
反序列化到map[string]interface{}:
m,ok:=gjson.Parse(json).Value().(map[string]interface{})
if!ok{
//notamap
##處理Bytes
如果你的JSON包含字節(jié)數(shù)組切片,與其調(diào)用`Get(string(data),path)`,不如調(diào)用[GetBytes](//tidwall/gjson#GetBytes)方法更優(yōu).
```go
varjson[]byte=...
result:=gjson.GetBytes(json,path)
如果你在使用gjson.GetBytes(json,path)方法,并且你想避免從result.Raw轉(zhuǎn)換到[]byte,你可以使用這種模式:
varjson[]byte=...
result:=gjson.GetBytes(json,path)
varraw[]byte
ifresult.Index0{
raw=json[result.Index:result.Index+len(result.Raw)]
}else{
raw=[]byte(result.Raw)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026西藏山南市加查縣文旅局公益性崗位1人參考考試題庫附答案解析
- 自學(xué)考試歷年真題及答案
- 2022~2025計算機二級考試題庫及答案參考54
- 郵儲銀行迪慶藏族自治州2025秋招結(jié)構(gòu)化面試經(jīng)典題及參考答案
- 生產(chǎn)許可證安全管理制度
- 塑膠生產(chǎn)負荷管理制度范本
- 團市委安全生產(chǎn)責(zé)任制度
- 摩托車工廠生產(chǎn)管理制度
- 生產(chǎn)制造業(yè)存貨管理制度
- 水泥生產(chǎn)線車間管理制度
- 2026年高考語文復(fù)習(xí)散文閱讀(四)
- 眼部艾灸課件
- 學(xué)堂在線 雨課堂 學(xué)堂云 實繩結(jié)技術(shù) 期末考試答案
- 乘務(wù)長崗位面試技巧與實戰(zhàn)經(jīng)驗分享
- 氣道濕化方法與指南
- 國家電力安全生產(chǎn)課件
- 2025年四川公務(wù)員面試真題及答案
- 安裝吊扇施工方案
- 分紅、年金、萬能保險測試題附答案
- GB/T 46456.3-2025信息技術(shù)設(shè)備互連智能家居互聯(lián)互通第3部分:局域互聯(lián)通用要求
- 國家基層高血壓防治管理指南 2025版圖文解讀
評論
0/150
提交評論