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