<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
專案地址:https://github.com/tidwall/gjson
下載:
$ go get -u github.com/tidwall/gjson
Get查詢指定路徑, 通過.
來區分. 比如"name.last"或者"age". 如果找到了匹配路徑, 將返回結果.
package main import "github.com/tidwall/gjson" const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}` func main() { value := gjson.Get(json, "name.last") println(value.String()) }
輸出結果:
Prichard
同時有 GetMany 方法批次獲取值, 也有 GetBytes 方法獲取位元組切片.
路徑是一系列被.
分隔的key拼接而成. 路徑可能包含萬用字元'*'和'?'. 通過下標存取陣列值. 通過'#'來獲取值在元素中的排位或存取子路徑. .
和萬用字元可以通過''來跳脫.
{ "name": {"first": "Tom", "last": "Anderson"}, "age":37, "children": ["Sara","Alex","Jack"], "fav.movie": "Deer Hunter", "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" "c?ildren.0" >> "Sara" "fav.movie" >> "Deer Hunter" "friends.#.first" >> ["Dale","Roger","Jane"] "friends.1.last" >> "Craig"
你同樣能通過#[...]
來查詢陣列中的第一個匹配的項, 或通過'#[...]#'查詢所有匹配的項. 查詢支援==
, !=
, <
, <=
, >
, >=
比較運運算元和'%'模糊匹配.
friends.#[last=="Murphy"].first >> "Dale" friends.#[last=="Murphy"]#.first >> ["Dale","Jane"] friends.#[age>45]#.last >> ["Craig","Murphy"] friends.#[first%"D*"].last >> "Murphy"
同樣支援JSON Lines, 使用 ..
字首, 把多行檔案視作陣列. 比如:
{"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"].age >> 57
ForEachLines
方法可以迭代json.
gjson.ForEachLine(json, func(line gjson.Result) bool{ println(line.String()) return true })
GJSON支援json型別包括 string
, number
, bool
, and null
. 陣列和物件被擋住基礎型別返回. Result
持有如下其中一種型別:
bool, for JSON booleans float64, for JSON numbers string, for JSON string literals nil, for JSON null
直接存取value:
result.Type // can be String, Number, True, False, Null, or JSON result.Str // holds the string result.Num // holds the float64 number result.Raw // holds the raw json result.Index // index of raw value in original json, zero means index unknown
有各種各樣的方便的函數可以獲取結果:
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(path string) Result result.ForEach(iterator func(key, value Result) bool) result.Less(token Result, caseSensitive bool) bool
result.Value()
方法返回 interface{}
Go基本型別之一. result.Array()
方法返回一組值. 如果結果是不存在的值, 將會返回空陣列. 如果結果不是JSON陣列, 將會返回只包含一個值的陣列.
boolean >> bool number >> float64 string >> string null >> nil array >> []interface{} object >> map[string]interface{}
result.Int()
和 result.Uint()
返回的是64位元大數位.
result.Int() int64 // -9223372036854775808 to 9223372036854775807 result.Uint() int64 // 0 to 18446744073709551615
假如你想從下列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 := range result.Array() { println(name.String()) }
你同樣能獲取陣列裡的物件:
name := gjson.Get(json, `programmers.#[lastName="Hunter"].firstName`) println(name.String()) // prints "Elliotte"
ForEach
方法允許你快速的迭代物件或陣列. key和value被傳遞給物件的迭代器函數. 只有value被傳遞給陣列. 迭代器返回false
將會終止迭代.
Parse(json)
方法可以簡單的分析json, result.Get(path)
查詢結果. 比如, 下面的幾種情況都將返回相同的結果:
gjson.Parse(json).Get("name").Get("last") gjson.Get(json, "name").Get("last") gjson.Get(json, "name.last")
有時你想要知道值是否存在.
value := gjson.Get(json, "name.last") if !value.Exists() { println("no last name") } else { println(value.String()) } // Or as one step if gjson.Get(json, "name.last").Exists() { println("has a last name") }
Get*
和 Parse*
方法預期json格式是正常的, 如果不正常, 將會返回不可預料的結果. 如果你讀取的json來源不可預料, 那麼你可以通過GJSON這麼事先驗證.
if !gjson.Valid(json) { return errors.New("invalid json") } value := gjson.Get(json, "name.last")
反序列化到map[string]interface{}
:
m, ok := gjson.Parse(json).Value().(map[string]interface{}) if !ok { // not a map } ## 處理Bytes 如果你的JSON包含位元組陣列切片, 與其呼叫`Get(string(data), path)`, 不如呼叫[GetBytes](https://godoc.org/github.com/tidwall/gjson#GetBytes)方法更優. ```go var json []byte = ... result := gjson.GetBytes(json, path)
如果你在使用gjson.GetBytes(json, path)
方法, 並且你想避免從result.Raw
轉換到 []byte
, 你可以使用這種模式:
var json []byte = ... result := gjson.GetBytes(json, path) var raw []byte if result.Index > 0 { raw = json[result.Index:result.Index+len(result.Raw)] } else { raw = []byte(result.Raw) }
這是最好的模式, 不會為子切片重新分配記憶體. 這個模式使用了result.Index
欄位, 它直接指向了raw data所處原來json中的位置. 如果result.Raw
是轉換成[]byte
的, result.Index
將會為0.
GetMany
方法可以用於同時獲取多個值.
results := gjson.GetMany(json, "name.first", "name.last", "age")
返回值是[]Result
型別, 總是返回正傳入路徑個數的數量.
到此這篇關於Go中使用gjson來操作JSON資料的實現的文章就介紹到這了,更多相關Go gjson操作JSON內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45