Heim > Backend-Entwicklung > Golang > Wie gehe ich mit „omitempty' mit Gos „time.Time' im JSON-Marshalling um?

Wie gehe ich mit „omitempty' mit Gos „time.Time' im JSON-Marshalling um?

Linda Hamilton
Freigeben: 2024-12-18 17:55:10
Original
582 Leute haben es durchsucht

How to Handle `omitempty` with Go's `time.Time` in JSON Marshaling?

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"`
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage