Maison > développement back-end > Golang > Comment gérer efficacement les structures JSON variables dans Go ?

Comment gérer efficacement les structures JSON variables dans Go ?

Patricia Arquette
Libérer: 2024-12-22 03:26:57
original
504 Les gens l'ont consulté

How to Efficiently Handle Variable JSON Structures in Go?

Décodage de données JSON avec une structure variable dans Go

Lorsque vous travaillez avec des données JSON provenant de sources tierces, il n'est pas rare de rencontrer des scénarios où la structure des données peut varier. Cela présente un défi pour les programmes Go qui utilisent des structures pour décomposer le JSON en types de données spécifiques.

Considérons un cas où les réponses JSON peuvent contenir soit un seul élément, soit un tableau au sein d'une propriété spécifique, telle que "gwrcmd". dans cet exemple. Une structure comme celle-ci conviendrait si "gwrcmd" est toujours un seul élément :

type Response struct {
    Gwrcmds struct {
        Gwrcmd struct {
            Gcmd  string
            Gdata struct {
                Gip struct {
                    Version string
                }
            }
        }
    }
}
Copier après la connexion

Cependant, si "gwrcmd" est parfois un tableau, nous rencontrerons une erreur lors de la désorganisation.

Utiliser json.RawMessage pour la flexibilité

Une approche commune de la gestion Les données JSON à structure variable doivent utiliser json.RawMessage, ce qui nous permet de capturer la valeur JSON arbitraire sans spécifier de type spécifique. Une fois que nous avons la valeur brute, nous pouvons l'examiner et décider comment la désorganiser davantage.

type Response struct {
    Gwrcmds struct {
        Gwrcmd json.RawMessage
    }
}
Copier après la connexion

Dans la méthode UnmarshalJSON pour la structure Response, nous pouvons inspecter le contenu de Gwrcmd et le désorganiser dans le fichier approprié. type :

func (r *Response) UnmarshalJSON(b []byte) error {
    if err := json.Unmarshal(b, &r.Gwrcmds); err != nil {
        return err
    }
    if r.Gwrcmds.Gwrcmd[0] == '[' {
        return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsArray)
    }
    return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsSingle)
}
Copier après la connexion

Dans ce cas, nous traitons à la fois les scénarios de tableau et d'élément unique en créant des champs séparés pour eux et en décomposant en fonction du contenu de la valeur brute.

Approches alternatives

Bien que json.RawMessage offre de la flexibilité, il nécessite une gestion manuelle de la structure des données et peut ne pas convenir dans tous les cas. Les approches alternatives incluent :

  • Utilisation des interfaces : Définissez une interface qui encapsule le comportement commun entre le tableau et les cas à élément unique, puis utilisez le type d'interface dans la définition de la structure.
  • Création de structures séparées : Comme suggéré dans le problème, créez des structures distinctes pour le tableau et des scénarios à élément unique et utilisez l'assertion de type dans la méthode UnmarshalJSON pour déterminer quelle structure utiliser.

La meilleure approche dépend des exigences spécifiques de l'application et de la complexité des données JSON.

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