Désorganisation de JSON dans une interface{} permet de gérer une gamme diversifiée de types de données. Cependant, affirmer directement le type de l'interface non marshalée{} pose des défis.
Dans le scénario donné, l'interface{} n'est pas marshalée à partir d'un message reçu. Tenter d'effectuer un changement de type sur cette interface{} comme le montre l'extrait de code produit des résultats inattendus, le type étant déclaré comme map[string]interface{}.
Pour résoudre ce problème, il est important de comprendre les types par défaut dans lesquels le package JSON est désorganisé, comme indiqué dans son documentation :
Puisque le démarshaling est effectué dans une interface{}, le type résultant sera limité à cet ensemble. Par conséquent, le package ne connaît pas les structures personnalisées telles que Something1 et Something2.
Options de solution :
1. Démarshaling direct :
Pour éviter la gestion de l'interface intermédiaire{}, les données JSON peuvent être directement démarshalées dans le type de structure souhaité. Par exemple :
var job Something1 json.Unmarshal([]byte(msg), &job)
2. Convertir à partir de l'interface générique :
Si travailler avec une interface générique{} est nécessaire, les données peuvent être décompressées manuellement à partir de la map[string]interface{}. Voici un exemple :
var input interface{} json.Unmarshal([]byte(msg), &input) if smth1, ok := input.(map[string]interface{}); ok { job := Something1{ Thing: smth1["thing"].(string), OtherThing: smth1["other_thing"].(int64), } }
3. Wrapper Struct :
Dans les cas où la gestion de différents types de données est courante, une structure wrapper avec une méthode UnmarshalJSON personnalisée peut simplifier le processus. Cette méthode peut tenter de regrouper les données dans différentes structures et définir le champ Données en conséquence.
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!