Heim > Artikel > Backend-Entwicklung > Warum wird das Num-Feld ignoriert, wenn JSON-Daten in eine Struktur entmarshallt werden, die eine eingebettete Struktur enthält?
Entmarshalling eingebetteter Strukturen in JSON
Beim Versuch, JSON-Daten in eine Struktur zu entmarshallen, die eine eingebettete Struktur enthält, treten bestimmte Herausforderungen auf. Betrachten Sie den folgenden Code:
<code class="go">type Outer struct { Inner Num int } type Inner struct { Data string } func (i *Inner) UnmarshalJSON(data []byte) error { i.Data = string(data) return nil }</code>
Bei Verwendung von json.Unmarshal(data, &Outer{}) wird das Num-Feld ignoriert. Warum passiert das?
Das Problem ergibt sich aus der Einbettung von Inner in Outer. Wenn die JSON-Bibliothek UnmarshalJSON auf Outer aufruft, ruft sie es versehentlich stattdessen auf Inner auf. Folglich enthält das Datenargument in func (i *Inner) UnmarshalJSON(data []byte) die gesamte JSON-Zeichenfolge, die dann nur für Inner verarbeitet wird.
Um dieses Problem zu beheben, muss Inner explizit sein Feld in Outer:
<code class="go">Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` }</code>
Hier ist ein Beispiel, das den richtigen Ansatz demonstriert:
<code class="go">package main import ( "encoding/json" "fmt" ) type Outer struct { I Inner `json:"I"` Num int `json:"Num"` } type Inner struct { Data string `json:"data"` } func (i *Inner) UnmarshalJSON(data []byte) error { i.Data = string(data) return nil } func main() { jsonStr := `{"I": "hello", "Num": 123}` var outer Outer err := json.Unmarshal([]byte(jsonStr), &outer) if err != nil { fmt.Println(err) } fmt.Println(outer) }</code>
Das obige ist der detaillierte Inhalt vonWarum wird das Num-Feld ignoriert, wenn JSON-Daten in eine Struktur entmarshallt werden, die eine eingebettete Struktur enthält?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!