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
Libérer: 2025-01-01 09:28:11
original
852 Les gens l'ont consulté

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

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

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!

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