Heim  >  Artikel  >  Backend-Entwicklung  >  Warum führt das JSON-Unmarshaling eingebetteter Strukturen zu unerwartetem Verhalten?

Warum führt das JSON-Unmarshaling eingebetteter Strukturen zu unerwartetem Verhalten?

Linda Hamilton
Linda HamiltonOriginal
2024-11-07 03:12:02688Durchsuche

Why does JSON Unmarshaling of Embedded Structs Lead to Unexpected Behavior?

JSON Unmarshal Embedded struct Exploration

Beim Versuch, ein JSON-Objekt in eine Struktur mit einem eingebetteten Feld zu entmarshalieren, kann es zu unerwartetem Verhalten kommen. Um dies zu veranschaulichen, betrachten Sie die folgenden Strukturdefinitionen:

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

Das Unmarshallen eines JSON-Objekts in eine Instanz von Outer mit json.Unmarshal(data, &Outer{}) führt dazu, dass nur das Inner-Feld ausgefüllt wird, während das Das Num-Feld bleibt unberührt. Dies kann auf die Art und Weise zurückgeführt werden, wie JSON eingebettete Felder unmarshallt.

Um dieses Problem zu beheben, wird empfohlen, das eingebettete Feld zu einem expliziten Feld in der übergeordneten Struktur zu machen. Durch diese Änderung kann der JSON-Unmarshaler direkt auf das Feld zugreifen und es entmarshalieren. Hier ist die korrigierte Strukturdefinition:

<code class="go">Outer struct {
    I Inner // make Inner an explicit field
    Num int `json:"Num"`
}</code>

In dieser aktualisierten Version wird das innere Feld zu einem expliziten Feld mit dem Namen I gemacht. Darüber hinaus ist das Num-Feld mit json:"Num" getaggt, um sicherzustellen, dass der JSON-Schlüssel „Num“ wird beim Unmarshalling diesem Feld zugeordnet.

Durch die Übernahme dieses Ansatzes werden sowohl das I- als auch das Num-Feld beim Unmarshalling eines JSON korrekt ausgefüllt Objekt in eine Instanz von Outer.

Das obige ist der detaillierte Inhalt vonWarum führt das JSON-Unmarshaling eingebetteter Strukturen zu unerwartetem Verhalten?. 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