Maison >développement back-end >Golang >Comment effectuer des assertions de type sur des données JSON non marshalées dans Go ?
Assertions de type avec des données non marshalées
Dans un système distribué, les données sont souvent échangées sous forme de chaînes JSON. Lors de la récupération de données JSON à partir d'une file d'attente de messages, vous pouvez rencontrer un scénario dans lequel vous devez désérialiser les données dans une interface {}, puis effectuer des assertions de type pour déterminer le type de structure réel des données.
Problème
Lors du déclassement de la chaîne JSON reçue dans une interface{} et de la tentative de saisie du résultat, vous pouvez rencontrer un résultat inattendu. Au lieu du type de structure attendu, vous obtenez une map[string]interface{}.
Solution
Le comportement par défaut du démarshaling JSON dans une interface{} donne des types tels que bool, float64, string, []interface{} et map[string]interface{}. Puisque Something1 et Something2 sont des structures personnalisées, elles ne sont pas reconnues par le démarshaler JSON.
Pour résoudre ce problème, il existe deux approches principales :
1. Démarrez directement dans les structures personnalisées
Code :
var input Something1 json.Unmarshal([]byte(msg), &input) // Type assertions and processing can be performed here var input Something2 json.Unmarshal([]byte(msg), &input) // Type assertions and processing can be performed here
2. Décompresser depuis Map Interface
Code :
var input interface{} json.Unmarshal([]byte(msg), &input) // Unpack the data from the map switch v := input.(type) { case map[string]interface{}: // Extract the data from the map and assign it to custom structs }
Approche avancée
Pour une solution plus polyvalente, envisagez de créer une structure "Unpacker" qui gère le démarshalage et l'assertion de type processus.
Code :
type Unpacker struct { Data interface{} } func (u *Unpacker) UnmarshalJSON(b []byte) error { smth1 := &Something1{} err := json.Unmarshal(b, smth1) if err == nil && smth1.Thing != "" { u.Data = smth1 return nil } smth2 := &Something2{} err = json.Unmarshal(b, smth2) if err != nil { return err } u.Data = smth2 return nil }
Conclusion
En utilisant l'une de ces approches, vous pouvez effectuer avec succès un type assertions sur les données qui sont d'abord non marshalées dans une interface {} à partir d'une chaîne JSON. Le choix de l'approche dépend des exigences spécifiques de votre application.
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!