Unmarshalling von JSON mit rekursiven Strukturen
Betrachten Sie die folgende JSON-Zeichenfolge, die eine Konfiguration für MongoDB darstellt:
[{ "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": "" } } ] } }]
Wir haben eine Struktur, DBS, die das modelliert 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` }
Beim Unmarshalling des JSON mit json.Unmarshal tritt jedoch ein Problem auf. Nach dem Vorgang bleibt unser DBS-Slice leer.
Das zugrunde liegende Problem besteht darin, dass unsere JSON-Eingabe über ein zusätzliches JSON-Objekt verfügt, das unsere DBS-Werte umhüllt, und unsere DBS-Werte Eigenschaften des „db“-Objekts sind. Darüber hinaus enthält das Array „Replicas“ Objekte mit unterschiedlichen Schlüsseln, die durch DBS dargestellt werden können.
Um diesen JSON genau zu modellieren, benötigen wir einen „dynamischen“ Typ. Als geeignete Option bietet sich eine Karte an. Daher ist die geeignete Struktur für unser JSON []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"` }
Diese alternative Struktur analysiert effektiv die JSON-Eingabe:
// ... if err := json.Unmarshal([]byte(src), &dbs); err != nil { panic(err) } fmt.Printf("%+v", dbs)
Die Ausgabe stellt die JSON-Struktur dar genau.
Darüber hinaus können wir das Modell optimieren, indem wir Zeiger verwenden und die erste Ebene modellieren, was immer der Fall ist „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"` }
Dieses aktualisierte Modell bietet eine präzisere und effizientere Darstellung der JSON-Konfiguration.
Das obige ist der detaillierte Inhalt vonWie kann ich verschachteltes JSON mit dynamischen Schlüsseln in Go erfolgreich entmarshalieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!