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

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

Patricia Arquette
Libérer: 2024-12-26 17:46:10
original
1068 Les gens l'ont consulté

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

Personnalisation du marshaling/unmarshaling JSON pour les champs time.Time avec omitempty

Dans ce scénario, utiliser omitempty avec les champs time.Time dans un JSON L’opération de marshaling/unmarshaling n’est pas aussi simple qu’avec d’autres types de données. Par défaut, time.Time est une structure et omitempty ne traite pas sa valeur zéro comme vide.

Solution 1 : Utiliser des pointeurs

Pour résoudre ce problème, convertissez le champs time.Time vers des pointeurs (*time.Time). Les pointeurs ont une valeur nulle, qui est traitée comme vide par JSON.

type MyStruct struct {
    Timestamp *time.Time `json:",omitempty"`
    Date      *time.Time `json:",omitempty"`
    Field     string    `json:",omitempty"`
}
Copier après la connexion

Avec cette modification, les champs avec des pointeurs nuls seront omis dans la sortie JSON.

Solution 2 : Custom Marshaler/Unmarshaler

Vous pouvez également implémenter un Marshaler et un Unmarshaler personnalisés pour gérer time.Champs de temps. Dans le Marshaler, vérifiez si une valeur time.Time est vide à l'aide de la méthode Time.IsZero(). S'il est vide, renvoie une valeur JSON nulle. Dans Unmarshaler, convertissez une valeur JSON nulle en valeur zéro de time.Time.

Exemple :

type MyStruct struct {
    Timestamp time.Time `json:",omitempty"`
    Date      time.Time `json:",omitempty"`
    Field     string    `json:",omitempty"`
}

func (ms MyStruct) MarshalJSON() ([]byte, error) {
    type Alias MyStruct
    var null NullTime
    if ms.Timestamp.IsZero() {
        null = NullTime(ms.Timestamp)
    }
    return json.Marshal(&struct {
        Alias
        Timestamp NullTime `json:"Timestamp"`
    }{
        Alias:     Alias(ms),
        Timestamp: null,
    })
}

func (ms *MyStruct) UnmarshalJSON(b []byte) error {
    type Alias MyStruct
    aux := &struct {
        *Alias
        Timestamp NullTime `json:"Timestamp"`
    }{
        Alias: (*Alias)(ms),
    }
    if err := json.Unmarshal(b, &aux); err != nil {
        return err
    }
    ms.Timestamp = time.Time(aux.Timestamp)
    return nil
}

// NullTime represents a time.Time that can be null
type NullTime time.Time

func (t NullTime) MarshalJSON() ([]byte, error) {
    if t.IsZero() {
        return []byte("null"), nil
    }
    return []byte(fmt.Sprintf("\"%s\"", time.Time(t).Format(time.RFC3339))), nil
}

func (t *NullTime) UnmarshalJSON(b []byte) error {
    str := string(b)
    if str == "null" {
        *t = NullTime{}
        return nil
    }

    ts, err := time.Parse(time.RFC3339, str[1:len(str)-1])
    if err != nil {
        return err
    }

    *t = NullTime(ts)
    return nil
}
Copier après la connexion

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 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