Maison >développement back-end >Golang >Comment puis-je personnaliser le démarshaling temporel JSON dans Go pour gérer les formats non RFC 3339 ?

Comment puis-je personnaliser le démarshaling temporel JSON dans Go pour gérer les formats non RFC 3339 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-18 21:09:13994parcourir

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

Personnalisation du démarshalage temporel JSON dans Go

Lorsque vous traitez des données JSON contenant des valeurs temporelles, le package d'encodage/json dans Go peut être limitatif si le format de l'heure n'adhère pas à la RFC 3339. Bien qu'il soit possible de transformer manuellement l'heure au format RFC 3339 pour l'analyse syntaxique, il existe une approche plus efficace.

Implémenter les interfaces Marshaler/Unmarshaler

Pour gérer les formats d'heure personnalisés, créez un type personnalisé qui implémente json.Marshaler et json. Interfaces du démarshaler. Cela vous permet de définir comment la valeur temporelle doit être sérialisée et désérialisée.

Voici un exemple de type personnalisé appelé 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 personnalisé :

  • UnmarshalJSON convertit la chaîne JSON en une valeur time.Time en utilisant une coutume spécifiée layout.
  • MarshalJSON convertit la valeur time.Time en une chaîne JSON en utilisant la même mise en page personnalisée.
  • IsSet est une méthode facultative pour vérifier si une valeur CustomTime a été définie (et non zéro).

Utilisation

Une fois le type CustomTime défini, il peut être utilisé comme champ de structure pour désérialiser les données JSON avec des formats d'heure personnalisés.

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

Cet exemple désérialise avec succès les données JSON où le champ Heure se trouve dans un "2006/01/02|15:04 : Format 05".

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