Maison >développement back-end >Golang >Comment gérer les formats d'heure non RFC 3339 dans Go JSON Unmarshaling ?

Comment gérer les formats d'heure non RFC 3339 dans Go JSON Unmarshaling ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-26 00:22:09993parcourir

How to Handle Non-RFC 3339 Time Formats in Go JSON Unmarshaling?

Unmarshaling personnalisé pour les formats d'heure non RFC 3339 dans Go JSON

Dans Go, le package encoding/json adhère strictement à la RFC 3339 lorsque désérialiser les valeurs de temps. Cependant, il arrive souvent que les données soient présentées dans des formats temporels différents. Cela peut être un problème si vous souhaitez éviter des conversions fastidieuses.

Utilisation de types personnalisés

Pour gérer cela, vous pouvez implémenter les interfaces json.Marshaler et json.Unmarshaler sur un type personnalisé. Cela vous permet de définir comment votre type est marshalé et non marshalé vers et depuis JSON.

Par exemple, le type CustomTime suivant vous permet de démarsaler les valeurs temporelles de différents formats :

type CustomTime struct {
    time.Time
}

const ctLayout = "2006/01/02|15:04:05"

func (ct *CustomTime) UnmarshalJSON(b []byte) (err error) {
    s := strings.Trim(string(b), "\"")
    if s == "null" {
        ct.Time = time.Time{}
        return
    }
    ct.Time, err = time.Parse(ctLayout, s)
    return
}

func (ct *CustomTime) MarshalJSON() ([]byte, error) {
    if ct.Time.IsZero() {
        return []byte("null"), nil
    }
    return []byte(fmt.Sprintf("\"%s\"", ct.Time.Format(ctLayout))), nil
}

var nilTime = (time.Time{}).UnixNano()

func (ct *CustomTime) IsSet() bool {
    return !ct.IsZero()
}

Dans ce type :

  • La méthode UnmarshalJSON analyse les valeurs de temps à partir d'un format personnalisé ("2006/01/02|15:04:05").
  • La méthode MarshalJSON génère la valeur temporelle dans le même format personnalisé.
  • La méthode IsSet vérifie si la valeur temporelle est set (différent de zéro).

Vous pouvez utiliser le type CustomTime dans vos structures JSON pour gérer la désérialisation des valeurs temporelles à partir de formats non RFC 3339 :

type Args struct {
    Time CustomTime
}

var data = `
    {"Time": "2014/08/01|11:27:18"}
`

func main() {
    a := Args{}
    fmt.Println(json.Unmarshal([]byte(data), &a))
    fmt.Println(a.Time.String())
}

Dans cet exemple, la structure Args utilise le type CustomTime pour le champ Time. Lors de la désérialisation de données JSON avec un format d'heure non RFC 3339, le type CustomTime gérera correctement la conversion.

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