Marshaling und Unmarshalling von JSON ohne Stapelüberlauf
Bei der JSON-Codierung kann der Aufruf von json.Unmarshal innerhalb der UnmarshalJSON-Methode zu einem Stapelüberlauf führen. Dieses Problem entsteht, weil der Decoder kontinuierlich nach einer benutzerdefinierten UnmarshalJSON-Implementierung sucht, die in diesem Fall wiederholt aufgerufen wird.
Um dies zu vermeiden, besteht eine gängige Lösung darin, einen neuen Typ mit dem Schlüsselwort „type“ zu erstellen. Dieser neue Typ dient effektiv als Hülle für den ursprünglichen Typ. Durch die Konvertierung des ursprünglichen Werts in den neuen Typ und die Übergabe an json.Unmarshal kann der Stapelüberlauf verhindert werden.
Dieser Ansatz ist effizient, da die Typkonvertierung die Darstellung der Daten nicht ändert. Gemäß der Go-Spezifikation ändern nicht-numerische Typkonvertierungen nur den Typ, ohne die zugrunde liegende Darstellung zu ändern.
Im folgenden Beispiel wird ein Personentyp mit einem numerischen Altersfeld definiert. Eine benutzerdefinierte UnmarshalJSON-Methode stellt sicher, dass das Alter niemals negativ ist:
type Person struct { Name string `json:"name"` Age int `json:"age"` } func (p *Person) UnmarshalJSON(data []byte) error { type person2 Person if err := json.Unmarshal(data, (*person2)(p)); err != nil { return err } // Post-processing after unmarshaling if p.Age < 0 { p.Age = 0 } return nil }
Diese Technik kann auch auf benutzerdefinierte Marshalling-Methoden (MarshalJSON) angewendet werden, um vor der Datenserialisierung eine Vorverarbeitung durchzuführen.
Denken Sie daran Beim Definieren einer String()-Methode für die benutzerdefinierte Textdarstellung ist es wichtig, zwischen der Verwendung von t und *t zu unterscheiden, um eine versehentliche Änderung der Standardzeichenfolge zu vermeiden Darstellung.
Das obige ist der detaillierte Inhalt vonWie vermeide ich einen Stapelüberlauf beim Marshaling und Unmarshaling von JSON in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!