首頁 >後端開發 >Golang >如何在 Go 中成功解組帶有動態鍵的巢狀 JSON?

如何在 Go 中成功解組帶有動態鍵的巢狀 JSON?

Barbara Streisand
Barbara Streisand原創
2024-12-18 09:42:22351瀏覽

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": ""
                }
            }
        ]
    }
}]
考慮以下表示MongoDB 配置的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 表示的具有不同鍵的物件。

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,我們需要一個「動態」類型。地圖是一個合適的選擇。因此,適合我們 JSON 的結構是 []map[string]DBS。

// ...

if err := json.Unmarshal([]byte(src), &dbs); err != nil {
    panic(err)
}
fmt.Printf("%+v", dbs)
此替代結構有效地解析JSON 輸入:

輸出表示JSON 結構

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"`
}
此外,我們可以透過使用指標和建模第一層來優化模型,這總是"db":

此更新的模型提供了更簡潔、更有效率的JSON 配置表示。

以上是如何在 Go 中成功解組帶有動態鍵的巢狀 JSON?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn