Maison > développement back-end > Golang > Comment gérer « omitempty » avec « time.Time » de Go dans le marshaling JSON ?

Comment gérer « omitempty » avec « time.Time » de Go dans le marshaling JSON ?

Linda Hamilton
Libérer: 2024-12-18 17:55:10
original
587 Les gens l'ont consulté

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

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"`
}
Copier après la connexion

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal