Einbetten einer Struktur mit der benutzerdefinierten MarshalJSON()-Methode
Wann Beim Einbetten einer Struktur mit einer benutzerdefinierten MarshalJSON()-Methode werden die Felder der äußeren Struktur auf den hochgestuften Typ heraufgestuft. Überschreiben der MarshalJSON()-Methode der eingebetteten Struktur. Dies kann beim Marshalling der äußeren Struktur zu unerwarteten Ergebnissen führen.
Problem:
Berücksichtigen Sie die folgenden Strukturen:
type Person struct { Name string `json:"name"` } func (p *Person) MarshalJSON() ([]byte, error) { return json.Marshal(struct { Name string `json:"name"` }{ Name: strings.ToUpper(p.Name), }) } type Employee struct { *Person JobRole string `json:"jobRole"` }
Marshalling einer Employee-Instanz erzeugt Unerwartetes Ergebnisse:
p := Person{"Bob"} e := Employee{&p, "Sales"} output, _ := json.Marshal(e) fmt.Printf("%s\n", string(output))
Ausgabe:
{"name": "BOB"}
Das Feld jobRole fehlt, obwohl es in der Employee-Instanz festgelegt ist.
Lösung:
Option 1: MarshalJSON() auf Embedded vermeiden Typ
Option 2: Implementieren Sie MarshalJSON() auf Outer Type
Hinweis:Beide Optionen erfordern eine gewisse manuelle Bearbeitung und können sich auf die Reihenfolge der Felder in der endgültigen JSON-Ausgabe auswirken.
Das obige ist der detaillierte Inhalt vonWie wird MarshalJSON() beim Einbetten von Strukturen mit benutzerdefinierten MarshalJSON()-Methoden korrekt ausgeführt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!