使用遞歸結構解組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中文網其他相關文章!