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

Go 专栏收录该内容
12 篇文章 0 订阅

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

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值