首頁 > 後端開發 > Golang > 如何在 Go 中解組複雜的自引用 JSON?

如何在 Go 中解組複雜的自引用 JSON?

Linda Hamilton
發布: 2024-12-16 09:29:09
原創
478 人瀏覽過

How to Unmarshal Complex, Self-Referential JSON in Go?

使用自引用結構元素解組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 結構中表示此JSON,我們定義以下內容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"`
}
登入後複製

但是,嘗試將 JSON 字串解組到該結構的切片中會導致空切片。

問題在於 JSON 輸入不是一個事實DBS 結構的切片。相反,它包含另一個 JSON 物件包裝器,並且 DBS 的值屬於「db」屬性。此外,「replicas」屬性包含一個 JSON 數組,其中包含持有不同鍵的對象,這些物件也可以由 DBS 結構體表示。

要完全建模此 JSON,我們需要一個動態類型,例如映射。我們需要的型別是[]map[string]DBS,它代表地圖的切片。映射鍵可以建模任何屬性名稱,值是由 DBS 結構體建模的 JSON 物件。

以下範例示範如何使用此類型完全解析JSON 輸入:

import (
    "encoding/json"
    "fmt"
)

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"`
}

func main() {
    var dbs []map[string]DBS
    if err := json.Unmarshal([]byte(src), &dbs); err != nil {
        panic(err)
    }
    fmt.Printf("%+v", dbs)
}
登入後複製

輸出:

[map[db:{URL:mongodb://localhost Port:27000 Uname: Pass: Authdb: Replicas:[map[rs01:{URL:mongodb://localhost Port:27001 Uname: Pass: Authdb: Replicas:[]}] map[rs02:{URL:mongodb://localhost Port:27002 Uname: Pass: Authdb: Replicas:[]}]]}]]
登入後複製

請注意,第一層總是“db”,可以進一步建模,我們可以切換為指標提高可讀性。

透過理解 JSON 輸入的巢狀和結構,我們可以有效地將其解組為準確表示資料的自訂結構。

以上是如何在 Go 中解組複雜的自引用 JSON?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板