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
Linda Hamiltonoriginal
2024-12-18 17:55:10592parcourir

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

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!

Déclaration:
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