Heim > Artikel > Backend-Entwicklung > Wie gehe ich mit eingebetteten Strukturen mit benutzerdefiniertem UnmarshalJSON in Go um?
In Go können beim Unmarshaling von JSON-Daten in eine Struktur mit eingebetteten Feldern Probleme auftreten, wenn die eingebettete Struktur ihre definiert eigene UnmarshalJSON-Methode. Dies liegt daran, dass die JSON-Bibliothek UnmarshalJSON der eingebetteten Struktur aufruft und die in der enthaltenden Struktur definierten Felder ignoriert.
Bedenken Sie die folgende Strukturdefinition:
<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>
Beim Unmarshaling von JSON in Outer mit json.Unmarshal(data, &Outer{}) löst das Inner-Feld seine aus UnmarshalJSON-Methode, die den gesamten JSON-String verbraucht. Dadurch wird das Num-Feld in Outer ignoriert.
Um dieses Problem zu beheben, konvertieren Sie die eingebettete Struktur Inner in ein explizites Feld in Outer:
<code class="go">type Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` }</code>
Indem Sie Inner zu einem expliziten Feld machen, stellen Sie sicher, dass die JSON-Bibliothek die Daten in die entsprechenden Felder von Outer entmarshmt, einschließlich Num Feld.
<code class="go">import ( "encoding/json" "fmt" ) type Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` } type Inner struct { Data string } func (i *Inner) UnmarshalJSON(data []byte) error { i.Data = string(data) return nil } func main() { data := []byte(`{"Data": "Example", "Num": 42}`) var outer Outer err := json.Unmarshal(data, &outer) if err != nil { fmt.Println(err) } fmt.Println(outer.I.Data, outer.Num) // Output: Example 42 }</code>
Das obige ist der detaillierte Inhalt vonWie gehe ich mit eingebetteten Strukturen mit benutzerdefiniertem UnmarshalJSON in Go um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!