Maison > développement back-end > Golang > Comment désérialiser les formats d'heure non RFC 3339 dans Go avec « encoding/json » ?

Comment désérialiser les formats d'heure non RFC 3339 dans Go avec « encoding/json » ?

Patricia Arquette
Libérer: 2024-12-18 20:57:10
original
703 Les gens l'ont consulté

How to Deserialize Non-RFC 3339 Time Formats in Go with `encoding/json`?

Désérialisation des formats d'heure non RFC 3339 dans Go avec encoding/json

Lors de l'utilisation du package encoding/json dans Go, le comportement par défaut pour la démarshalisation des valeurs d'heure est de respecter strictement le format RFC 3339. Cependant, que se passe-t-il si vous rencontrez des formats d'heure qui s'écartent de cette norme ?

Implémentation de types d'heure personnalisés

Pour gérer de telles situations, vous pouvez implémenter les interfaces json.Marshaler et json.Unmarshaler sur un fichier personnalisé taper. Cela vous permet de définir une logique d'encodage et de décodage personnalisée pour votre format d'heure spécifique.

Voici un exemple de type CustomTime personnalisé :

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

Utilisation dans une structure

Pour utiliser le type CustomTime, vous pouvez l'intégrer en tant que champ dans un struct :

type Args struct {
    Time CustomTime
}
Copier après la connexion

Exemple

Voici un exemple d'utilisation de la structure Args et du type CustomTime pour désorganiser une chaîne JSON contenant un format d'heure non RFC 3339 :

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

Sortie :

<nil>
2014-08-01 11:27:18 +0000 UTC
Copier après la connexion

En implémentant le CustomTime personnalisé tapez, vous pouvez gérer la désérialisation des formats d'heure qui ne sont pas au format RFC 3339.

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