Maison > développement back-end > Golang > Comment désorganiser en toute sécurité JSON dans une interface {} et gérer l'assertion de type ?

Comment désorganiser en toute sécurité JSON dans une interface {} et gérer l'assertion de type ?

Linda Hamilton
Libérer: 2024-12-17 11:59:25
original
554 Les gens l'ont consulté

How to Safely Unmarshal JSON into an Interface{} and Handle Type Assertion?

Désagrégation dans une interface{} et exécution d'une assertion de type

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 :

  • bool
  • float64
  • string
  • []interface{}
  • map[string]interface{}
  • néant

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)
Copier après la connexion

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),
  }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal