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é :
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!