使用递归结构解组 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中文网其他相关文章!