將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:[]}
輸出
以上是如何在 Go 中使用動態類型解組自引用 JSON 字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!