JSON-Auslassen von Zeitfeldern mit omitempty
Um Zeitfelder selektiv in die JSON-Serialisierung einzubeziehen, wurde der json:",omitempty" -Tag wird häufig verwendet. Bei Verwendung mit time.Time-Feldern kann es jedoch zu unerwartetem Verhalten kommen.
Das Kernproblem liegt in der Natur von time.Time als Struktur. Im Gegensatz zu Skalartypen wie Zeichenfolgen oder Ganzzahlen, die einen eindeutigen „leeren“ Zustand haben (z. B. eine leere Zeichenfolge), haben Strukturen einen „Null“-Wert, der eine initialisierte, aber leere Instanz darstellt. In diesem Fall initialisiert der Nullwert von time.Time alle seine Felder auf ihre Standardwerte.
Aufgrund dieser Unterscheidung erkennt json:",omitempty" einen Nullwert time.Time nicht als „ empty“ und schließt es immer in die JSON-Ausgabe ein. Um diese Einschränkung zu überwinden, können Sie einen der folgenden Ansätze anwenden:
1. Zeigertyp verwenden:
Durch die Konvertierung des time.Time-Felds in einen Zeiger (*time.Time) können Sie die Tatsache ausnutzen, dass Nullzeiger bei der JSON-Verarbeitung als „leer“ gelten. Diese Lösung vereinfacht den Code:
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
2. Implementieren Sie benutzerdefinierten Marshaler und Unmarshaler:
Wenn die Verwendung eines Zeigers nicht möglich ist, können Sie benutzerdefinierte JSON-Marshaler- und Unmarshaler-Methoden für Ihre Struktur implementieren, die time.Time.IsZero() nutzen, um das Feld bedingt einzuschließen oder auszuschließen:
// MarshalJSON implements the custom JSON Marshaler for MyStruct. func (ms MyStruct) MarshalJSON() ([]byte, error) { type Alias MyStruct if ms.Timestamp.IsZero() { return json.Marshal(struct{ Alias }{ms.Field}) } return json.Marshal(struct{ Alias }{Alias(ms)}) } // UnmarshalJSON implements the custom JSON Unmarshaler for MyStruct. func (ms *MyStruct) UnmarshalJSON(b []byte) error { type Alias MyStruct var as Alias if err := json.Unmarshal(b, &as); err != nil { return err } ms.Field = as.Field if !as.Timestamp.IsZero() { ms.Timestamp = &as.Timestamp } return nil }
Beachten Sie, dass die Implementierung benutzerdefinierter Marshaler- und Unmarshaler-Methoden ein tieferes Verständnis der zugrunde liegenden JSON-Serialisierung erfordert Deserialisierungsprozesse.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit „omitempty' mit Gos „time.Time' im JSON-Marshalling um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!