Maison > développement back-end > Golang > Comment gérer le démarshalling JSON lorsque les données peuvent être un tableau ou un objet ?

Comment gérer le démarshalling JSON lorsque les données peuvent être un tableau ou un objet ?

Susan Sarandon
Libérer: 2024-12-13 19:00:13
original
394 Les gens l'ont consulté

How to Handle JSON Unmarshalling When the Data Might Be an Array or an Object?

Comment désorganiser JSON avec un tableau ou un objet

Lorsque vous traitez JSON, gérer des scénarios dans lesquels les données renvoyées peuvent être un tableau ou un l’objet peut être un défi. Cet article aborde le problème et présente une solution qui implique l'utilisation du type json.RawMessage et un démarshalling dynamique basé sur la structure JSON.

Dévoilement de la structure JSON dynamique

Envisagez les réponses JSON suivantes :

{"gwrcmds":{"gwrcmd":{"gcmd":"SPA_UserGetSmartMeterList","gdata":{"gip":{"version":"1"
Copier après la connexion
{"gwrcmds":{"gwrcmd":[{"gcmd":"DeviceGetChart","gdata":{"gip":{"version":"1"
Copier après la connexion

Comme le montrent les réponses, gwrcmd peut être un objet ou un tableau. Pour tenir compte de cela, une structure Go personnalisée est définie comme :

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

Résoudre l'énigme du démarshalling

La clé pour résoudre ce problème réside dans l'utilisation de json.RawMessage , qui accepte n'importe quelle valeur JSON. Nous créons un wrapper dans la structure Response pour contenir le JSON brut :

type Response struct {
    RawAWrapper struct {
        RawA json.RawMessage `json:"a"`
    }
Copier après la connexion

Unmarshaling dynamique basé sur la structure JSON

Dans la méthode UnmarshalJSON de la structure Response, nous examinons le premier octet de RawAWrapper.RawA pour déterminer s'il représente un tableau ou un objet. En fonction du résultat, nous désorganisons les données en conséquence :

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

Cette approche offre une flexibilité dans la gestion de JSON avec différentes structures sans avoir besoin de plusieurs structures.

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