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

Comment gérer les formats d'heure non RFC 3339 lors du démarchage de JSON dans Go ?

DDD
Libérer: 2024-12-30 22:02:11
original
520 Les gens l'ont consulté

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

Démarshaling JSON personnalisé pour les formats d'heure non RFC 3339

Le package encoding/json dans Go adhère strictement au format d'heure RFC 3339 lorsque désérialiser les données JSON. Cela peut être gênant lorsqu'il s'agit de formats d'heure qui s'écartent de cette norme.

Solution : implémenter des marshalers et des démarshalers personnalisés

Au lieu de modifier les données JSON existantes ou de s'appuyer sur étapes de conversion intermédiaires, une solution plus adaptée consiste à implémenter les interfaces json.Marshaler et json.Unmarshaler sur un site personnalisé. type.

L'exemple suivant montre comment créer un type personnalisé (CustomTime) qui gère la désérialisation d'un format d'heure non-RFC 3339 spécifique :

import (
    "fmt"
    "strconv"
    "strings"
    "time"

    "github.com/golang/protobuf/ptypes/timestamp"
)

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

type Args struct {
    Time CustomTime
}

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

func main() {
    a := Args{}
    if err := json.Unmarshal([]byte(data), &a); err != nil {
        fmt.Println("Error unmarshaling: ", err)
        return
    }

    if !a.Time.IsSet() {
        fmt.Println("Time not set")
    } else {
        fmt.Println(a.Time.String())
    }
}
Copier après la connexion

Remarque : La méthode CustomTime.IsSet() vérifie si le champ Time est différent de zéro, fournissant ainsi un moyen de déterminer si la valeur temporelle a été réellement définie ou non.

En implémentant des Marshalers et Unmarshalers personnalisés, vous bénéficiez de la flexibilité nécessaire pour gérer les formats d'heure qui peuvent s'écarter de la norme RFC 3339, permettant une désérialisation transparente des données JSON dans Go.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal