首頁 >後端開發 >Golang >如何在 Go 中使用動態類型解組自引用 JSON 字串?

如何在 Go 中使用動態類型解組自引用 JSON 字串?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-25 13:13:09142瀏覽

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中文網其他相關文章!

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