Go中使用gjson來操作JSON數(shù)據(jù)的實現(xiàn)_第1頁
Go中使用gjson來操作JSON數(shù)據(jù)的實現(xiàn)_第2頁
Go中使用gjson來操作JSON數(shù)據(jù)的實現(xiàn)_第3頁
Go中使用gjson來操作JSON數(shù)據(jù)的實現(xiàn)_第4頁
Go中使用gjson來操作JSON數(shù)據(jù)的實現(xiàn)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論