Merungkai JSON dengan Struktur Rekursif
Pertimbangkan rentetan JSON berikut yang mewakili konfigurasi untuk MongoDB:
[{ "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": "" } } ] } }]
Kami mempunyai struct, DBS, yang memodelkan 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` }
Walau bagaimanapun, kami menghadapi masalah apabila menyahmarshal JSON menggunakan json.Unmarshal. Selepas proses itu, kepingan DBS kami kekal kosong.
Masalah asas ialah input JSON kami mempunyai objek JSON tambahan yang membungkus nilai DBS kami dan nilai DBS kami ialah sifat objek "db". Selain itu, tatasusunan "replika" mengandungi objek dengan kekunci yang berbeza-beza yang boleh diwakili oleh DBS.
Untuk memodelkan JSON ini dengan tepat, kami memerlukan jenis "dinamik". Peta berfungsi sebagai pilihan yang sesuai. Oleh itu, struktur yang sesuai untuk JSON kami ialah []map[string]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"` }
Struktur alternatif ini menghuraikan input JSON dengan berkesan:
// ... if err := json.Unmarshal([]byte(src), &dbs); err != nil { panic(err) } fmt.Printf("%+v", dbs)
Output mewakili struktur JSON dengan tepat.
Selain itu, kita boleh mengoptimumkan model dengan menggunakan penunjuk dan memodelkan tahap pertama, yang sentiasa "db":
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"` }
Model yang dikemas kini ini menyediakan perwakilan konfigurasi JSON yang lebih ringkas dan cekap.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Berjaya Menyahmarshal Nested JSON dengan Kunci Dinamik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!