Omission JSON des champs temporels avec omitempty
Dans le but d'inclure sélectivement les champs temporels dans la sérialisation JSON, le json:",omitempty" la balise est couramment utilisée. Cependant, il peut présenter un comportement inattendu lorsqu'il est utilisé avec des champs time.Time.
Le problème principal réside dans la nature de time.Time en tant que structure. Contrairement aux types scalaires tels que les chaînes ou les entiers, qui ont un état clair « vide » (par exemple, une chaîne vide), les structures ont une valeur « zéro » qui représente une instance initialisée mais vide. Dans ce cas, la valeur zéro de time.Time initialise tous ses champs à leurs valeurs par défaut.
En raison de cette distinction, json:",omitempty" ne reconnaît pas une valeur time.Time de valeur zéro comme " vide" et l'inclura toujours dans la sortie JSON. Pour surmonter cette limitation, vous pouvez adopter l'une des approches suivantes :
1. Utiliser le type de pointeur :
En convertissant le champ time.Time en pointeur (*time.Time), vous pouvez profiter du fait que les pointeurs nuls sont considérés comme "vides" dans la gestion JSON. Cette solution simplifie le code :
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
2. Implémentez Custom Marshaler et Unmarshaler :
Si l'utilisation d'un pointeur est impossible, vous pouvez implémenter des méthodes JSON Marshaler et Unmarshaler personnalisées pour votre structure qui exploitent time.Time.IsZero() pour inclure ou exclure conditionnellement le champ :
// MarshalJSON implements the custom JSON Marshaler for MyStruct. func (ms MyStruct) MarshalJSON() ([]byte, error) { type Alias MyStruct if ms.Timestamp.IsZero() { return json.Marshal(struct{ Alias }{ms.Field}) } return json.Marshal(struct{ Alias }{Alias(ms)}) } // UnmarshalJSON implements the custom JSON Unmarshaler for MyStruct. func (ms *MyStruct) UnmarshalJSON(b []byte) error { type Alias MyStruct var as Alias if err := json.Unmarshal(b, &as); err != nil { return err } ms.Field = as.Field if !as.Timestamp.IsZero() { ms.Timestamp = &as.Timestamp } return nil }
Notez que la mise en œuvre des méthodes Marshaler et Unmarshaler personnalisées nécessite une compréhension plus approfondie de la sérialisation et de la désérialisation JSON sous-jacentes. processus.
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!