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
Susan Sarandonoriginal
2024-12-13 19:00:13398parcourir

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"
{"gwrcmds":{"gwrcmd":[{"gcmd":"DeviceGetChart","gdata":{"gip":{"version":"1"

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

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"`
    }

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)
}

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!

Déclaration:
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