Wie gehe ich mit eingebetteten Strukturen mit benutzerdefiniertem UnmarshalJSON in Go um?

Barbara Streisand
Freigeben: 2024-11-04 14:29:02
Original
205 Leute haben es durchsucht

How to Handle Embedded Structs with Custom UnmarshalJSON in Go?

Fehlerbehandlung: Benutzerdefiniertes Unmarshal für eingebettete Strukturen

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.

Fallstudie

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>
Nach dem Login kopieren

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.

Lösung: Explizites Feld

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>
Nach dem Login kopieren

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.

Beispiel

<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>
Nach dem Login kopieren

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!

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