首页 >后端开发 >Golang >如何在 Go 中解组复杂的自引用 JSON?

如何在 Go 中解组复杂的自引用 JSON?

Linda Hamilton
Linda Hamilton原创
2024-12-16 09:29:09481浏览

How to Unmarshal Complex, Self-Referential JSON in Go?

使用自引用结构元素解组 JSON

考虑以下具有嵌套结构的 JSON 字符串:

[{
    "db": {
        "url": "mongodb://localhost",
        "port": "27000",
        "uname": "",
        "pass": "",
        "authdb": "",
        "replicas": [
            {
                "rs01": {
                    "url":"mongodb://localhost",
                    "port": "27001",
                    "uname": "",
                    "pass": "",
                    "authdb": ""
                }
            },
            {
                "rs02": {
                    "url":"mongodb://localhost",
                    "port": "27002",
                    "uname": "",
                    "pass": "",
                    "authdb": ""
                }
            }
        ]
    }
}]

为了在 Go 结构中表示此 JSON,我们定义以下内容struct:

type DBS struct {
    URL      string   `json:"url"`
    Port     string   `json:"port"`
    Uname    string   `json:"uname"`
    Pass     string   `json:"pass"`
    Authdb   string   `json:"authdb"`
    Replicas []DBS    `json:"replicas"`
}

但是,尝试将 JSON 字符串解组到该结构的切片中会导致空切片。

问题在于 JSON 输入不是一个事实DBS 结构的切片。相反,它包含另一个 JSON 对象包装器,并且 DBS 的值属于“db”属性。此外,“replicas”属性包含一个 JSON 数组,其中包含持有不同键的对象,这些对象也可以由 DBS 结构体表示。

要完全建模此 JSON,我们需要一个动态类型,例如映射。我们需要的类型是[]map[string]DBS,它代表地图的切片。映射键可以建模任何属性名称,值是由 DBS 结构体建模的 JSON 对象。

以下示例演示如何使用此类型完全解析 JSON 输入:

import (
    "encoding/json"
    "fmt"
)

type DBS struct {
    URL      string           `json:"url"`
    Port     string           `json:"port"`
    Uname    string           `json:"uname"`
    Pass     string           `json:"pass"`
    Authdb   string           `json:"authdb"`
    Replicas []map[string]DBS `json:"replicas"`
}

func main() {
    var dbs []map[string]DBS
    if err := json.Unmarshal([]byte(src), &dbs); err != nil {
        panic(err)
    }
    fmt.Printf("%+v", dbs)
}

输出:

[map[db:{URL:mongodb://localhost Port:27000 Uname: Pass: Authdb: Replicas:[map[rs01:{URL:mongodb://localhost Port:27001 Uname: Pass: Authdb: Replicas:[]}] map[rs02:{URL:mongodb://localhost Port:27002 Uname: Pass: Authdb: Replicas:[]}]]}]]

请注意,第一级始终是“db”,可以进一步建模,我们可以切换为指针提高可读性。

通过理解 JSON 输入的嵌套和结构,我们可以有效地将其解组为准确表示数据的自定义结构。

以上是如何在 Go 中解组复杂的自引用 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

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