Heim > Backend-Entwicklung > Golang > Wie entmarshaliere ich einen selbstreferenziellen JSON-String in Go mit einem dynamischen Typ?

Wie entmarshaliere ich einen selbstreferenziellen JSON-String in Go mit einem dynamischen Typ?

Mary-Kate Olsen
Freigeben: 2024-12-25 13:13:09
Original
138 Leute haben es durchsucht

How to Unmarshal a Self-Referential JSON String in Go with a Dynamic Type?

Unmarshalling eines JSON-Strings zu einer Struktur mit einem selbstreferenziellen Element

In Go, Unmarshalling eines JSON-Strings zu einer Struktur mit einem selbstreferenziellen Element Referenzelement kann eine Herausforderung sein. Sehen wir uns ein konkretes Beispiel und eine Lösung an, um dieses Problem effektiv anzugehen.

JSON-Eingabe und Strukturdefinition

Betrachten Sie die folgende JSON-Eingabe:

[{
    "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

Und die entsprechende Go-Struktur:

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

Unmarshal-Funktion und Ausgabe

Die bereitgestellte Funktion „loadConfigs()“ versucht, die JSON-Zeichenfolge in ein Segment von DBS-Strukturen zu entmarshalieren:

func loadConfigs() []DBS {
    var config []DBS
    raw, err := ioutil.ReadFile("./config.json")
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }

    json.Unmarshal(raw, &config)
    return config
}
Nach dem Login kopieren

Dies führt jedoch zu einem leeren Segment, [ ]DBS{, da die JSON-Eingabe kein Slice von DBS-Strukturen ist, sondern ein JSON-Objekt-Wrapper, der ein Array von enthält Objekte.

Lösung: Zuordnung zu einem dynamischen Typ

Um die JSON-Eingabe vollständig zu beschreiben, ist ein dynamischer Typ wie eine Karte erforderlich. Die aktualisierte Typdefinition lautet:

type DBSReplicated struct {
    DB *DBS `json:"db"`
}
Nach dem Login kopieren
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

Mit diesem neuen Typ können wir die JSON-Eingabe genau analysieren:

var dbs []*DBReplicated
if err := json.Unmarshal([]byte(src), &dbs); err != nil {
    panic(err)
}

db := dbs[0].DB
fmt.Printf("%+v\n", db)
for _, dbs := range db.Replicas {
    for name, replica := range dbs {
        fmt.Printf("%s: %+v\n", name, replica)
    }
}
Nach dem Login kopieren

Ausgabe

&{URL:mongodb://localhost Port:27000 Uname: Pass: Authdb: Replicas:[map[rs01:0x10538200] map[rs02:0x10538240]]}
rs01: &{URL:mongodb://localhost Port:27001 Uname: Pass: Authdb: Replicas:[]}
rs02: &{URL:mongodb://localhost Port:27002 Uname: Pass: Authdb: Replicas:[]}
Nach dem Login kopieren

Schlüssel Punkte

  • Verwenden Sie einen Kartentyp, um dynamische JSON-Eingaben zu modellieren.
  • Achten Sie auf die richtige Syntax für JSON-Tag-Eigenschaftsnamen.
  • Erwägen Sie die Verwendung von Zeigern in der Struktur, um verschachtelte Strukturen zu ermöglichen.

Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich einen selbstreferenziellen JSON-String in Go mit einem dynamischen Typ?. 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