Json.Unmarshal innerhalb von UnmarshalJSON aufrufen, ohne einen Stapelüberlauf zu verursachen
Problem:
Benutzerdefinierte Implementierungen von UnmarshalJSON Der Aufruf von json.Unmarshal kann zum Stack führen Überläufe.
Lösung:
Um das Stapelüberlaufproblem beim Aufruf von json.Unmarshal in UnmarshalJSON zu vermeiden, verwenden Sie die folgende Technik:
Begründung:
Durch die Verwendung des Schlüsselworts „type“ zum Erstellen eines neuen Typs werden effektiv alle Methoden aus dem ursprünglichen Typ entfernt. Wenn der Wrapper-Typ während des Unmarshaling-Prozesses verwendet wird, findet der JSON-Decoder keine benutzerdefinierte UnmarshalJSON-Implementierung und verwendet die Standardimplementierung. Dies verhindert das Problem des Stapelüberlaufs.
Beispiel:
Betrachten Sie einen Personentyp mit einem Altersfeld:
type Person struct { Name string `json:"name"` Age int `json:"age"` } func (p *Person) UnmarshalJSON(data []byte) error { type personWrapper Person if err := json.Unmarshal(data, (*personWrapper)(p)); err != nil { return err } // Post-processing after unmarshaling: if p.Age < 0 { p.Age = 0 } return nil }
Diese Technik ermöglicht benutzerdefinierte Nachbearbeitung nach dem Unmarshaling, wobei das Problem des Stapelüberlaufs vermieden wird, das mit dem Aufruf von json.Unmarshal innerhalb verbunden ist UnmarshalJSON.
Das obige ist der detaillierte Inhalt vonWie vermeide ich einen Stapelüberlauf beim Aufruf von „json.Unmarshal' innerhalb von „UnmarshalJSON'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!