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
Barbara StreisandOriginal
2024-12-18 09:42:22355Durchsuche

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": ""
                }
            }
        ]
    }
}]

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!

Stellungnahme:
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