Inhaltsverzeichnis
JSON omitempty mit time.Time-Feld: Eine benutzerdefinierte Lösung
Zeigerbasiert Lösung
Benutzerdefinierter Marshaler und Unmarshaler
Fazit
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?

Dec 22, 2024 am 10:55 AM

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!

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

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich? GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich?

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Mar 10, 2025 pm 05:38 PM

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go?

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren? Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren? Mar 03, 2025 pm 05:22 PM

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren?

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Mar 10, 2025 pm 03:20 PM

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren?

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Mar 10, 2025 pm 05:36 PM

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen?

Wie kann ich Linter und statische Analyse -Tools verwenden, um die Qualität und Wartbarkeit meines GO -Codes zu verbessern? Wie kann ich Linter und statische Analyse -Tools verwenden, um die Qualität und Wartbarkeit meines GO -Codes zu verbessern? Mar 10, 2025 pm 05:38 PM

Wie kann ich Linter und statische Analyse -Tools verwenden, um die Qualität und Wartbarkeit meines GO -Codes zu verbessern?

Wie schreibe ich Dateien in Go Language bequem? Wie schreibe ich Dateien in Go Language bequem? Mar 03, 2025 pm 05:15 PM

Wie schreibe ich Dateien in Go Language bequem?

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache? Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache? Mar 03, 2025 pm 05:18 PM

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache?

See all articles