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

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

Susan Sarandon
Libérer: 2024-12-22 10:55:11
original
367 Les gens l'ont consulté

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

Omitempty JSON avec time.Time Field : une solution personnalisée

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.

Basé sur un pointeur Solution

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

Marshaler et Unmarshaler personnalisés

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

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.

Conclusion

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!

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