Heim  >  Artikel  >  Backend-Entwicklung  >  Warum wird das Num-Feld ignoriert, wenn JSON-Daten in eine Struktur entmarshallt werden, die eine eingebettete Struktur enthält?

Warum wird das Num-Feld ignoriert, wenn JSON-Daten in eine Struktur entmarshallt werden, die eine eingebettete Struktur enthält?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-04 21:18:02181Durchsuche

Why is the Num field ignored when unmarshalling JSON data into a struct containing an embedded struct?

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!

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