首页 >后端开发 >Golang >如何使用 json.Unmarshal 有效解析 Go 中的复杂 JSON 结构?

如何使用 json.Unmarshal 有效解析 Go 中的复杂 JSON 结构?

Barbara Streisand
Barbara Streisand原创
2025-01-03 13:41:43824浏览

How to Effectively Parse Complex JSON Structures in Go Using `json.Unmarshal`?

如何使用 Go Unmarshal 解析复杂的 JSON:揭示内部工作原理

Go 中的encoding/json 包提供了 json.Unmarshal简化 JSON 解析任务的函数。然而,遇到复杂的 JSON 结构可能具有挑战性。

解码为接口{}

对于未知的 JSON 数据,可以使用 Unmarshal 将其解码为接口{} 。这种方法会生成一个 map[string]interface{} 值,其中键是字符串,值是 interface{} 类型。

例如,考虑以下 JSON:

{
     "k1" : "v1", 
     "k2" : "v2", 
     "k3" : 10, 
     "result" : [
                 [
                 ["v4", v5, {"k11" : "v11", "k22" : "v22"}]
                 , ... , 
                 ["v4", v5, {"k33" : "v33", "k44" : "v44"}
                 ]
                 ], 
                 "v3"
                ] 
}

Go解码和访问此数据的代码:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    b := []byte(`{
       "k1" : "v1", 
       "k3" : 10,
       result:["v4",12.3,{"k11" : "v11", "k22" : "v22"}]
    }`)
    var f interface{}
    err := json.Unmarshal(b, &f)
    if err != nil {
        fmt.Println(err)
        return
    }
    m := f.(map[string]interface{})
    for k, v := range m {
        switch vv := v.(type) {
        case string:
            fmt.Println(k, "is string", vv)
        case int:
            fmt.Println(k, "is int", vv)
        case []interface{}:
            fmt.Println(k, "is an array:")
            for i, u := range vv {
                fmt.Println(i, u)
            }
        default:
            fmt.Println(k, "is of a type I don't know how to handle")
        }
    }
}

通过断言接口类型并利用类型开关,可以导航

以上是如何使用 json.Unmarshal 有效解析 Go 中的复杂 JSON 结构?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn