Démarshaling JSON personnalisé pour les formats d'heure non RFC 3339
Le package encoding/json dans Go adhère strictement au format d'heure RFC 3339 lorsque désérialiser les données JSON. Cela peut être gênant lorsqu'il s'agit de formats d'heure qui s'écartent de cette norme.
Solution : implémenter des marshalers et des démarshalers personnalisés
Au lieu de modifier les données JSON existantes ou de s'appuyer sur étapes de conversion intermédiaires, une solution plus adaptée consiste à implémenter les interfaces json.Marshaler et json.Unmarshaler sur un site personnalisé. type.
L'exemple suivant montre comment créer un type personnalisé (CustomTime) qui gère la désérialisation d'un format d'heure non-RFC 3339 spécifique :
import ( "fmt" "strconv" "strings" "time" "github.com/golang/protobuf/ptypes/timestamp" ) 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() } type Args struct { Time CustomTime } var data = ` {"Time": "2014/08/01|11:27:18"} ` func main() { a := Args{} if err := json.Unmarshal([]byte(data), &a); err != nil { fmt.Println("Error unmarshaling: ", err) return } if !a.Time.IsSet() { fmt.Println("Time not set") } else { fmt.Println(a.Time.String()) } }
Remarque : La méthode CustomTime.IsSet() vérifie si le champ Time est différent de zéro, fournissant ainsi un moyen de déterminer si la valeur temporelle a été réellement définie ou non.
En implémentant des Marshalers et Unmarshalers personnalisés, vous bénéficiez de la flexibilité nécessaire pour gérer les formats d'heure qui peuvent s'écarter de la norme RFC 3339, permettant une désérialisation transparente des données JSON dans Go.
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!