Golang 從 Json 串中快速取出需要的字段
在 web 編程中很多情況下接口的數據是 json 格式,在我們拿到接口的 json 數據後如何方便地從中提取出需要的字段呢?我們可以自定義一個結構體,然後通過 Golang 的標準庫 json 解析到我們定義的結構體中。但是當 json 格式比較複雜,嵌套層級比較深的時候,還是用這種方法就比較麻煩了。在這裏推薦一個包: gojsonq,可以很簡便地從 json 串中提取出需要的字段,無需定義額外的結構體,然後解析,直接鏈式地從 json 串中提取需要的字段即可,有點類似動態語言:
go get github.com/thedevsaddam/gojsonq/v2
-
Github 地址:
https://github.com/thedevsaddam/gojsonq -
Package 簡介:
A simple Go package to Query over JSON Data. It provides simple, elegant and fast ODM like API to access, query JSON document.
示例一:從如下 json 串中提取 name.first 字段數據
{
"name":{
"first":"Tom",
"last":"Hanks"
},
"age":61
}
Find 方法返回的結果爲 interface{} 類型。
package main
import gojsonq "github.com/thedevsaddam/gojsonq/v2"
func main() {
const json = `{"name":{"first":"Tom","last":"Hanks"},"age":61}`
name := gojsonq.New().FromString(json).Find("name.first")
println(name.(string)) // Tom
}
示例二:從如下 json 串中提取 temperatures 字段數據,並計算平均值
{
"city":"dhaka",
"type":"weekly",
"temperatures":[
30,
39.9,
35.4,
33.5,
31.6,
33.2,
30.7
]
}
支持列表計算:
package main
import (
"fmt"
gojsonq "github.com/thedevsaddam/gojsonq/v2"
)
func main() {
const json = `{"city":"dhaka","type":"weekly","temperatures":[30,39.9,35.4,33.5,31.6,33.2,30.7]}`
avg := gojsonq.New().FromString(json).From("temperatures").Avg()
fmt.Printf("Average temperature: %.2f", avg) // 33.471428571428575
}
示例三:從如下 json 串中提取 data.pageNumber 數組,賦值給 Golang 整型數組
上面的例子提取簡單的數值類型,返回的是 interface{} 類型,可以通過類型斷言得到需要的數據。如果提取的是數組類型,是無法通過類型斷言來獲取 interface{} 類型的值的,可以使用 FindR 拿到結果,然後通過結果的 As 方法將數據解析到我們定義的變量類型中。
{
"code":"0",
"message":"success",
"data":{
"thumb_up":0,
"system":0,
"im":0,
"avatarUrl":"https://profile.csdnimg.cn/F/4/B/helloworld",
"invitation":0,
"comment":0,
"follow":0,
"totalCount":0,
"coupon_order":0,
"pageNumbers":[
1,
2,
3,
4,
5,
6
]
},
"status":true
}
func main() {
jsonStr := `{
"code":"0",
"message":"success",
"data":{
"thumb_up":0,
"system":0,
"im":0,
"avatarUrl":"https://profile.csdnimg.cn/F/4/B/helloworld",
"invitation":0,
"comment":0,
"follow":0,
"totalCount":0,
"coupon_order":0,
"pageNumbers":[
1,
2,
3,
4,
5,
6
]
},
"status":true
}`
// 保存 json 字符串中 pageNumbers 字段列表數據
pageNumbers := make([]int, 0)
result, err := gojsonq.New().FromString(jsonStr).FindR("data.pageNumbers")
if err != nil {
fmt.Println(err)
}
// 將提前的數據解析爲自定義變量類型
err = result.As(&pageNumbers)
if err != nil {
fmt.Println(err)
}
fmt.Println(pageNumbers)
}
更多功能及示例見官方文檔:
https://github.com/thedevsaddam/gojsonq/wiki/Queries