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"` }
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 }
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!