Heim > Backend-Entwicklung > Golang > Wie kann man „omitempty' mit „time.Time'-Feldern im JSON-Marshalling/Unmarshaling von Go effektiv handhaben?

Wie kann man „omitempty' mit „time.Time'-Feldern im JSON-Marshalling/Unmarshaling von Go effektiv handhaben?

Patricia Arquette
Freigeben: 2024-12-26 17:46:10
Original
987 Leute haben es durchsucht

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

Anpassen des JSON-Marshallings/Unmarshalings für time.Time-Felder mit omitempty

In diesem Szenario wird omitempty mit time.Time-Feldern in einem JSON verwendet Der Marshalling-/Unmarshaling-Vorgang ist nicht so einfach wie bei anderen Datentypen. Standardmäßig ist time.Time eine Struktur und omitempty behandelt seinen Nullwert nicht als leer.

Lösung 1: Zeiger verwenden

Um dieses Problem zu beheben, konvertieren Sie die time.Time-Felder zu Zeigern (*time.Time). Zeiger haben einen Nullwert, der von JSON als leer behandelt wird.

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

Mit dieser Änderung werden Felder mit Nullzeigern in der JSON-Ausgabe weggelassen.

Lösung 2 : Benutzerdefinierter Marshaler/Unmarshaler

Alternativ können Sie einen benutzerdefinierten Marshaler implementieren und Unmarshaler zur Verarbeitung von time.Time-Feldern. Überprüfen Sie im Marshaler mit der Methode Time.IsZero(), ob ein time.Time-Wert leer ist. Wenn es leer ist, geben Sie einen Null-JSON-Wert zurück. Konvertieren Sie im Unmarshaler einen Null-JSON-Wert in den Nullwert von time.Time.

Beispiel:

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

func (ms MyStruct) MarshalJSON() ([]byte, error) {
    type Alias MyStruct
    var null NullTime
    if ms.Timestamp.IsZero() {
        null = NullTime(ms.Timestamp)
    }
    return json.Marshal(&struct {
        Alias
        Timestamp NullTime `json:"Timestamp"`
    }{
        Alias:     Alias(ms),
        Timestamp: null,
    })
}

func (ms *MyStruct) UnmarshalJSON(b []byte) error {
    type Alias MyStruct
    aux := &struct {
        *Alias
        Timestamp NullTime `json:"Timestamp"`
    }{
        Alias: (*Alias)(ms),
    }
    if err := json.Unmarshal(b, &aux); err != nil {
        return err
    }
    ms.Timestamp = time.Time(aux.Timestamp)
    return nil
}

// NullTime represents a time.Time that can be null
type NullTime time.Time

func (t NullTime) MarshalJSON() ([]byte, error) {
    if t.IsZero() {
        return []byte("null"), nil
    }
    return []byte(fmt.Sprintf("\"%s\"", time.Time(t).Format(time.RFC3339))), nil
}

func (t *NullTime) UnmarshalJSON(b []byte) error {
    str := string(b)
    if str == "null" {
        *t = NullTime{}
        return nil
    }

    ts, err := time.Parse(time.RFC3339, str[1:len(str)-1])
    if err != nil {
        return err
    }

    *t = NullTime(ts)
    return nil
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann man „omitempty' mit „time.Time'-Feldern im JSON-Marshalling/Unmarshaling von Go effektiv handhaben?. 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