„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie gehe ich mit eingebetteten Strukturen mit benutzerdefiniertem UnmarshalJSON in Go um?

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

Veröffentlicht am 09.11.2024
Durchsuche:392

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

Betrachten Sie die folgende Strukturdefinition:

type Outer struct {
    Inner
    Num int
}

type Inner struct {
    Data string
}

func (i *Inner) UnmarshalJSON(data []byte) error {
    i.Data = string(data)
    return nil
}

Beim Unmarshaling von JSON in Outer mit json.Unmarshal(data, &Outer{}) löst das Inner-Feld seine UnmarshalJSON-Methode aus und verbraucht die gesamte JSON-Zeichenfolge. 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:

type Outer struct {
    I Inner // make Inner an explicit field
    Num int `json:"Num"`
}

Indem Sie Inner zu einem expliziten Feld machen, stellen Sie sicher, dass die JSON-Bibliothek die Daten in die entsprechenden Felder von Outer, einschließlich des Num-Felds, entmarshmt.

Beispiel

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
}
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3