Heim > Backend-Entwicklung > Golang > Wie kann ich verschachteltes JSON mit dynamischen Schlüsseln in Go erfolgreich entmarshalieren?

Wie kann ich verschachteltes JSON mit dynamischen Schlüsseln in Go erfolgreich entmarshalieren?

Barbara Streisand
Freigeben: 2024-12-18 09:42:22
Original
347 Leute haben es durchsucht

How Can I Successfully Unmarshal Nested JSON with Dynamic Keys in Go?

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": ""
                }
            }
        ]
    }
}]
Nach dem Login kopieren

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`
}
Nach dem Login kopieren

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"`
}
Nach dem Login kopieren

Diese alternative Struktur analysiert effektiv die JSON-Eingabe:

// ...

if err := json.Unmarshal([]byte(src), &dbs); err != nil {
    panic(err)
}
fmt.Printf("%+v", dbs)
Nach dem Login kopieren

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"`
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage