Maison > développement back-end > Golang > Comment puis-je regrouper efficacement les données JSON dans des structures spécifiques lors de l'utilisation de « json.Unmarshal » de Go avec « interface{} » ?

Comment puis-je regrouper efficacement les données JSON dans des structures spécifiques lors de l'utilisation de « json.Unmarshal » de Go avec « interface{} » ?

Mary-Kate Olsen
Libérer: 2024-12-26 13:44:10
original
380 Les gens l'ont consulté

How Can I Efficiently Unmarshal JSON Data into Specific Structs When Using Go's `json.Unmarshal` with `interface{}`?

Désagrégation dans une interface{} et assertion de type

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

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!

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