Golang 從 Json 串中快速取出需要的字段

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章