Énoncé du problème
Lors de l'utilisation de json.Unmarshal de Go pour décoder des chaînes à partir d'un système de messagerie, on constate que le résultat est une map[string]interface{} au lieu des types de structure attendus (Somthing1 ou Somthing2), rendant l'assertion de type impossible.
Cause racine
La fonction json.Unmarshal, lors du démarshalage dans une interface{}, utilise par défaut des types connus comme []interface{} et map[string]interface{}. Dans le code donné, l'entrée de variable d'interface reçoit une map[string]interface{} représentant les données JSON non marshalées, mais l'instruction switch tente de l'affirmer directement comme Somthing1 ou Somthing2.
Solution
Étant donné que le JSON n'est pas nativement désorganisé dans les structures souhaitées, il existe deux options pour résoudre ce problème. problème :
1. Inspecter et convertir à partir de la carte générique :
Une approche consiste à inspecter la map[string]interface{} et à décompresser manuellement les données dans les types de structure appropriés. Cependant, cela nécessite une gestion minutieuse des erreurs potentielles et une attribution manuelle des valeurs.
2. Utiliser un Unmarshaller JSON personnalisé :
Une solution plus propre consiste à créer un Unmarshaller JSON personnalisé pour gérer le processus de démarshaling. Ce désassembleur personnalisé peut discerner le type de structure correct en fonction des données JSON et le désassembler en conséquence. Voici un exemple d'un tel unmarshaller :
type Unpacker struct { Data interface{} } func (u *Unpacker) UnmarshalJSON(b []byte) error { smth1 := &Something1{} err := json.Unmarshal(b, smth1) // no error, but we also need to make sure we unmarshaled something if err == nil && smth1.Thing != "" { u.Data = smth1 return nil } // abort if we have an error other than the wrong type if _, ok := err.(*json.UnmarshalTypeError); err != nil && !ok { return err } smth2 := &Something2{} err = json.Unmarshal(b, smth2) if err != nil { return err } u.Data = smth2 return nil }
En transmettant une instance de ce unmarshaller personnalisé à json.Unmarshal, le champ Data résultant contiendra les données non marshalées dans le type de structure correct, permettant une assertion de type transparente. .
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!