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 ?
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() }
Pour utiliser le type CustomTime, vous pouvez l'intégrer en tant que champ dans un struct :
type Args struct { Time CustomTime }
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()) }
Sortie :
<nil> 2014-08-01 11:27:18 +0000 UTC
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!