首页 > 后端开发 > Golang > 如何在 Go 中使用动态类型解组自引用 JSON 字符串?

如何在 Go 中使用动态类型解组自引用 JSON 字符串?

Mary-Kate Olsen
发布: 2024-12-25 13:13:09
原创
137 人浏览过

How to Unmarshal a Self-Referential JSON String in Go with a Dynamic Type?

将 JSON 字符串解组为具有自引用元素的结构体

在 Go 中,将 JSON 字符串解组为具有自引用元素的结构体参考元素可能具有挑战性。让我们探讨一个具体的示例和有效解决此问题的解决方案。

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

解组函数和输出

提供的函数 loadConfigs() 尝试将 JSON 字符串解组为 DBS 结构片段:

func loadConfigs() []DBS {
    var config []DBS
    raw, err := ioutil.ReadFile("./config.json")
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }

    json.Unmarshal(raw, &config)
    return config
}
登录后复制

但是,这会产生一个空切片 []DBS{,因为 JSON输入不是 DBS 结构体的切片,而是包含对象数组的 JSON 对象包装器。

解决方案:映射到动态类型

完整描述 JSON 输入,需要像地图这样的动态类型。更新后的类型定义变为:

type DBSReplicated 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 输入:

var dbs []*DBReplicated
if err := json.Unmarshal([]byte(src), &dbs); err != nil {
    panic(err)
}

db := dbs[0].DB
fmt.Printf("%+v\n", db)
for _, dbs := range db.Replicas {
    for name, replica := range dbs {
        fmt.Printf("%s: %+v\n", name, replica)
    }
}
登录后复制

输出

&{URL:mongodb://localhost Port:27000 Uname: Pass: Authdb: Replicas:[map[rs01:0x10538200] map[rs02:0x10538240]]}
rs01: &{URL:mongodb://localhost Port:27001 Uname: Pass: Authdb: Replicas:[]}
rs02: &{URL:mongodb://localhost Port:27002 Uname: Pass: Authdb: Replicas:[]}
登录后复制

钥匙点

  • 使用映射类型对动态 JSON 输入进行建模。
  • 注意 JSON 标记属性名称的正确语法。
  • 考虑使用指针在结构中允许嵌套结构。

以上是如何在 Go 中使用动态类型解组自引用 JSON 字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

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