官网
https://github.com/tidwall/gjson
一 简介
gjson实际上是get + json的缩写,用于读取 JSON 串
二 使用
1.安装
go get github.com/tidwall/gjson
2.使用
package mainimport ("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)}
}