L'option de balise omitempty ne fonctionne pas avec time.Time car il s'agit d'une structure. Cela signifie que la valeur "zéro" pour un time.Time est une valeur valide avec toutes ses valeurs de champ définies sur zéro, qui n'est pas traitée comme "vide" par l'encodeur json.
Pour surmonter ce défi, Explorons une approche personnalisée qui utilise un pointeur vers time.Time (*time.Time) et implémente un encodage et un décodage personnalisés.
En passant à un pointeur, les valeurs nulles sont interprétées comme "vides" par l'encodeur JSON :
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Date *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
Si vous préférez ne pas le faire utilisez des pointeurs, vous pouvez implémenter des interfaces Marshaler et Unmarshaler personnalisées :
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 }
Ici, le La méthode MarshalJSON définit les instances time.Time de valeur nulle sur la valeur Go zéro équivalente, permettant la gestion des champs vides.
La solution basée sur un pointeur est simple et efficace. Cependant, si l'utilisation de pointeurs n'est pas réalisable, l'approche personnalisée Marshaler/Unmarshaler offre un moyen flexible de gérer les valeurs time.Time vides.
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!