官網
https://github.com/tidwall/gjson
一 簡介
gjson實際上是get + json的縮寫,用於讀取 JSON 串
二 使用
1.安裝
go get github.com/tidwall/gjson
2.使用
package main
import (
"fmt"
"github.com/tidwall/gjson"
)
func main() {
json := `{"name":{"first":"li","last":"dj"},"age":18}`
lastName := gjson.Get(json, "name.last")
fmt.Println("last name:", lastName.String())
age := gjson.Get(json, "age")
fmt.Println("age:", age.Int())
}
只需要傳入 JSON 串和要讀取的鍵路徑即可。注意一點細節,因為gjson.Get()函式實際上返回的是gjson.Result型別,我們要呼叫其相應的方法進行轉換對應的型別。如上面的String()和Int()方法。
如果是直接列印輸出,其實可以省略String(),fmt包的大部分函式都可以對實現fmt.Stringer介面的型別呼叫String()方法。
3. 遍歷
gjson.Get()方法返回一個gjson.Result型別的物件,json.Result提供了ForEach()方法用於遍歷。該方法接受一個型別為func (key, value gjson.Result) bool的回撥函式。遍歷物件時key和value分別為物件的鍵和值;遍歷陣列時,value為陣列元素,key為空(不是索引)。回撥返回false時,遍歷停止。
const json = `
{
"name":"dj",
"age":18,
"pets": ["cat", "dog"],
"contact": {
"phone": "123456789",
"email": "dj@example.com"
}
}`
func main() {
pets := gjson.Get(json, "pets")
pets.ForEach(func(_, pet gjson.Result) bool {
fmt.Println(pet)
return true
})
contact := gjson.Get(json, "contact")
contact.ForEach(func(key, value gjson.Result) bool {
fmt.Println(key, value)
return true
})
}
4.一次性獲得多個值
呼叫gjson.Get()一次只能讀取一個值,多次呼叫又比較麻煩,gjson提供了GetMany()可以一次讀取多個值,返回一個陣列[]gjson.Result。
const json = `
{
"name":"dj",
"age":18,
"pets": ["cat", "dog"],
"contact": {
"phone": "123456789",
"email": "dj@example.com"
}
}`
func main() {
results := gjson.GetMany(json, "name", "age", "pets.#", "contact.phone")
for _, result := range results {
fmt.Println(result)
}
}