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

Wie gehe ich mit „omitempty' mit „time.Time'-Feldern im Go JSON Marshaling um?

Susan Sarandon
Freigeben: 2024-12-22 10:55:11
Original
367 Leute haben es durchsucht

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

JSON omitempty mit time.Time-Feld: Eine benutzerdefinierte Lösung

Die Tag-Option omitempty funktioniert nicht mit time.Time, da es sich um eine Struktur handelt. Das bedeutet, dass der „Null“-Wert für eine Zeit.Zeit ein gültiger Wert ist, bei dem alle seine Feldwerte auf Null gesetzt sind, was vom JSON-Encoder nicht als „leer“ behandelt wird.

Um diese Herausforderung zu meistern, Lassen Sie uns einen benutzerdefinierten Ansatz erkunden, der einen Zeiger auf time.Time (*time.Time) verwendet und benutzerdefinierte Kodierung und Dekodierung implementiert.

Zeigerbasiert Lösung

Durch den Wechsel zu einem Zeiger werden Nullwerte vom JSON-Encoder als „leer“ interpretiert:

type MyStruct struct {
    Timestamp *time.Time `json:",omitempty"`
    Date      *time.Time `json:",omitempty"`
    Field     string    `json:",omitempty"`
}
Nach dem Login kopieren

Benutzerdefinierter Marshaler und Unmarshaler

Wenn Sie dies nicht möchten Wenn Sie Zeiger verwenden, können Sie benutzerdefinierte Marshaler- und Unmarshaler-Schnittstellen implementieren:

type MyStruct struct {
    Timestamp time.Time `json:"Timestamp"`
    Date      time.Time `json:"Date"`
    Field     string    `json:"Field"`
}

func (ms MyStruct) MarshalJSON() ([]byte, error) {
    type Alias MyStruct
    if ms.Timestamp.IsZero() {
        ms.Timestamp = time.Time{}
    }
    if ms.Date.IsZero() {
        ms.Date = time.Time{}
    }
    return json.Marshal(Alias(ms))
}

func (ms *MyStruct) UnmarshalJSON(data []byte) error {
    type Alias MyStruct
    aux := &Alias{}
    if err := json.Unmarshal(data, aux); err != nil {
        return err
    }
    *ms = MyStruct(aux)
    return nil
}
Nach dem Login kopieren

Hier die Die MarshalJSON-Methode setzt nullwertige time.Time-Instanzen auf den entsprechenden Go-Nullwert und ermöglicht so die Handhabung leerer Felder.

Fazit

Die zeigerbasierte Lösung ist unkompliziert und effektiv. Wenn die Verwendung von Zeigern jedoch nicht möglich ist, bietet der benutzerdefinierte Marshaler/Unmarshaler-Ansatz eine flexible Möglichkeit, mit leeren time.Time-Werten umzugehen.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit „omitempty' mit „time.Time'-Feldern im Go JSON Marshaling 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