Personnalisation du marshaling/unmarshaling JSON pour les champs time.Time avec omitempty
Dans ce scénario, utiliser omitempty avec les champs time.Time dans un JSON L’opération de marshaling/unmarshaling n’est pas aussi simple qu’avec d’autres types de données. Par défaut, time.Time est une structure et omitempty ne traite pas sa valeur zéro comme vide.
Solution 1 : Utiliser des pointeurs
Pour résoudre ce problème, convertissez le champs time.Time vers des pointeurs (*time.Time). Les pointeurs ont une valeur nulle, qui est traitée comme vide par JSON.
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Date *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
Avec cette modification, les champs avec des pointeurs nuls seront omis dans la sortie JSON.
Solution 2 : Custom Marshaler/Unmarshaler
Vous pouvez également implémenter un Marshaler et un Unmarshaler personnalisés pour gérer time.Champs de temps. Dans le Marshaler, vérifiez si une valeur time.Time est vide à l'aide de la méthode Time.IsZero(). S'il est vide, renvoie une valeur JSON nulle. Dans Unmarshaler, convertissez une valeur JSON nulle en valeur zéro de time.Time.
Exemple :
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 }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!