Golang如何访问深层嵌套的JSON数据?

Golang如何访问深层嵌套的JSON数据? 图片

如何使用Go语言访问深层嵌套的JSON数据?- Hashnode

图片

开发者经常需要从其他服务获取JSON数据并进行查询。查询JSON文档通常比较耗时。最近几天,我一直在开发一个用于Golang的包,旨在简化JSON数据的查询过程。这个想法的灵感来源于…


更多关于Golang如何访问深层嵌套的JSON数据?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

我正好需要这个 ❤️

更多关于Golang如何访问深层嵌套的JSON数据?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用JSON解码或JSON反序列化将传入数据转换为合适的数据结构,然后通过调用数据结构的字段直接访问数据。

在下一个版本中,它将支持自定义反序列化器。

头像

问题:提供自定义反序列化器选项

允许用户提供自定义反序列化器,如下所示:

package main
import (
 "github.com/davecgh/go-spew/spew"
 jsoniter "github.com/json-iterator/go"
 "github.com/thedevsaddam/gojsonq"
)
func main() {
 opt := gojsonq.Opt{
 Unmarshaler:...

高优先级

在Go语言中访问深层嵌套的JSON数据时,通常有两种主要方法:使用标准库的encoding/json进行手动解组(unmarshaling)到结构体,或利用第三方库如gjson进行动态查询。以下分别给出示例。

方法1:使用标准库定义结构体并解组

如果JSON结构已知,可以定义对应的嵌套结构体,然后使用json.Unmarshal解析数据。这种方法类型安全,但需要预先定义结构。

示例代码:

package main

import (
    "encoding/json"
    "fmt"
)

// 定义与JSON对应的嵌套结构体
type Data struct {
    Level1 struct {
        Level2 struct {
            Level3 string `json:"level3"`
        } `json:"level2"`
    } `json:"level1"`
}

func main() {
    jsonData := `{
        "level1": {
            "level2": {
                "level3": "target_value"
            }
        }
    }`

    var data Data
    err := json.Unmarshal([]byte(jsonData), &data)
    if err != nil {
        panic(err)
    }

    // 访问深层嵌套字段
    fmt.Println(data.Level1.Level2.Level3) // 输出: target_value
}

方法2:使用第三方库gjson进行动态查询

对于未知或动态的JSON结构,可以使用gjson库直接通过路径查询,无需定义结构体。首先安装库:go get github.com/tidwall/gjson

示例代码:

package main

import (
    "fmt"
    "github.com/tidwall/gjson"
)

func main() {
    jsonData := `{
        "level1": {
            "level2": {
                "level3": "target_value"
            }
        }
    }`

    // 使用gjson.Get通过路径查询嵌套值
    value := gjson.Get(jsonData, "level1.level2.level3")
    fmt.Println(value.String()) // 输出: target_value
}

处理数组嵌套的情况

如果JSON中包含数组,可以使用索引访问。例如,假设JSON路径为level1.items.0.name

package main

import (
    "fmt"
    "github.com/tidwall/gjson"
)

func main() {
    jsonData := `{
        "level1": {
            "items": [
                {"name": "first"},
                {"name": "second"}
            ]
        }
    }`

    // 查询数组中的第一个元素的name字段
    value := gjson.Get(jsonData, "level1.items.0.name")
    fmt.Println(value.String()) // 输出: first
}

这些方法覆盖了大多数深层嵌套JSON访问场景。标准库方法适合结构固定的数据,而gjson适用于灵活查询。根据具体需求选择合适的方式。

回到顶部