Unmarshaling personnalisé pour les formats d'heure non RFC 3339 dans Go JSON
Dans Go, le package encoding/json adhère strictement à la RFC 3339 lorsque désérialiser les valeurs de temps. Cependant, il arrive souvent que les données soient présentées dans des formats temporels différents. Cela peut être un problème si vous souhaitez éviter des conversions fastidieuses.
Utilisation de types personnalisés
Pour gérer cela, vous pouvez implémenter les interfaces json.Marshaler et json.Unmarshaler sur un type personnalisé. Cela vous permet de définir comment votre type est marshalé et non marshalé vers et depuis JSON.
Par exemple, le type CustomTime suivant vous permet de démarsaler les valeurs temporelles de différents formats :
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 :
Vous pouvez utiliser le type CustomTime dans vos structures JSON pour gérer la désérialisation des valeurs temporelles à partir de formats non RFC 3339 :
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()) }
Dans cet exemple, la structure Args utilise le type CustomTime pour le champ Time. Lors de la désérialisation de données JSON avec un format d'heure non RFC 3339, le type CustomTime gérera correctement la conversion.
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!