首页 > 后端开发 > Golang > 如何在 Go 中成功解组带有动态键的嵌套 JSON?

如何在 Go 中成功解组带有动态键的嵌套 JSON?

Barbara Streisand
发布: 2024-12-18 09:42:22
原创
349 人浏览过

How Can I Successfully Unmarshal Nested JSON with Dynamic Keys in Go?

使用递归结构解组 JSON

考虑以下表示 MongoDB 配置的 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": ""
                }
            }
        ]
    }
}]
登录后复制

我们有一个结构体 DBS,它模拟了JSON:

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.Unmarshal 解组 JSON 时遇到问题。处理完成后,我们的 DBS 切片仍为空。

根本问题是我们的 JSON 输入有一个额外的 JSON 对象包装我们的 DBS 值,而我们的 DBS 值是“db”对象的属性。此外,“replicas”数组包含可以由 DBS 表示的具有不同键的对象。

为了准确地建模此 JSON,我们需要一个“动态”类型。地图是一个合适的选择。因此,适合我们 JSON 的结构是 []map[string]DBS。

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"`
}
登录后复制

此替代结构有效地解析 JSON 输入:

// ...

if err := json.Unmarshal([]byte(src), &dbs); err != nil {
    panic(err)
}
fmt.Printf("%+v", dbs)
登录后复制

输出表示 JSON 结构

此外,我们可以通过使用指针和建模第一层来优化模型,这总是"db":

type DBReplicated struct {
    DB *DBS `json:"db"`
}

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"`
}
登录后复制

此更新的模型提供了更简洁、更高效的 JSON 配置表示。

以上是如何在 Go 中成功解组带有动态键的嵌套 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板