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

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

Patricia Arquette
Patricia Arquetteoriginal
2025-01-01 09:28:11903parcourir

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

Démarshaling JSON des formats d'heure non RFC 3339 dans Go

Le comportement par défaut du package encoding/json dans Go est de marshaler et désassembler les valeurs de temps au format RFC 3339. Cependant, que se passe-t-il si vous rencontrez des données JSON avec des valeurs temporelles dans un format différent ?

Solution avec transformation manuelle

Une approche consiste à désérialiser la valeur temporelle en une chaîne, transformez-le manuellement au format RFC 3339, puis appliquez à nouveau json.Unmarshal. Bien que cette méthode fonctionne, elle introduit une surcharge de traitement supplémentaire et encombre le code.

Type d'heure personnalisé

Une solution plus élégante consiste à implémenter json.Marshaler et json.Unmarshaler interfaces sur un type d’heure personnalisé. Cela permet une gestion personnalisée de la sérialisation et de la désérialisation des valeurs temporelles.

Exemple de mise en œuvre

Voici un exemple de type d'heure personnalisé nommé CustomTime :

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 d'heure personnalisé :

  • UnmarshalJSON gère la désérialisation des formats d'heure non RFC 3339 dans le type CustomTime.
  • MarshalJSON gère la sérialisation des valeurs CustomTime dans un format personnalisé.
  • IsSet fournit un moyen de vérifier si le CustomTime a été réellement défini.

Utilisation

Maintenant, vous pouvez utilisez le type CustomTime dans votre code de désérialisation JSON :

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())
}

Cette approche vous permet de gérer les formats d'heure non RFC 3339 dans les données JSON de manière élégante et efficace sans compromettre la flexibilité. Il présente également la puissance de la mise en œuvre d'interfaces json.Marshaler et json.Unmarshaler personnalisées pour gérer la sérialisation et la désérialisation des types de données.

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