Maison > développement back-end > Golang > Comment gérer les structures JSON imbriquées et éviter les erreurs « Impossible de regrouper la chaîne dans le champ de structure Go » ?

Comment gérer les structures JSON imbriquées et éviter les erreurs « Impossible de regrouper la chaîne dans le champ de structure Go » ?

DDD
Libérer: 2024-11-25 08:34:10
original
219 Les gens l'ont consulté

How to Handle Nested JSON Structures and Avoid

Désagrégation de JSON avec des structures imbriquées

Lorsque vous travaillez avec des réponses JSON complexes, vous pouvez parfois rencontrer des erreurs telles que "impossible de désorganiser la chaîne dans le champ de structure Go". ". Cela se produit généralement lorsque la réponse JSON contient une valeur de chaîne qui représente une autre structure JSON.

Considérez cette structure Go incomplète ManifestResponse et une réponse JSON correspondante :

type ManifestResponse struct {
    Name         string `json:"name"`
    Tag          string `json:"tag"`
    Architecture string `json:"architecture"`

    FsLayers []struct {
        BlobSum string `json:"blobSum"`
    } `json:"fsLayers"`

    History []struct {
        V1Compatibility struct {
            ID              string `json:"id"`
            Parent          string `json:"parent"`
            Created         string `json:"created"`
        } `json:"v1Compatibility"`
    } `json:"history"`
}
Copier après la connexion
{
    "name": "library/redis",
    "tag": "latest",
    "architecture": "amd64",
    "history": [
        {
            "v1Compatibility": "{\"id\":\"ef8a93741134ad37c834c32836aefbd455ad4aa4d1b6a6402e4186dfc1feeb88\",\"parent\":\"9c8b347e3807201285053a5413109b4235cca7d0b35e7e6b36554995cfd59820\",\"created\":\"2017-10-10T02:53:19.011435683Z\"}"
        }
    ]
}
Copier après la connexion

Lorsque vous essayez de désorganisez le JSON dans la structure Go, vous pourriez rencontrer l'erreur suivante :

json: cannot unmarshal string into Go struct field .v1Compatibility of type struct { ID string "json:\"id\""; Parent string "json:\"parent\""; Created string "json:\"created\"" }
Copier après la connexion

Le problème découle du fait que v1Compatibility dans la réponse JSON est une valeur de chaîne contenant du contenu JSON. Pour résoudre ce problème, nous pouvons implémenter un démarshaling en deux passes :

type ManifestResponse struct {
    Name         string `json:"name"`
    Tag          string `json:"tag"`
    Architecture string `json:"architecture"`

    FsLayers []struct {
        BlobSum string `json:"blobSum"`
    } `json:"fsLayers"`

    History []struct {
        V1CompatibilityRaw string `json:"v1Compatibility"`
        V1Compatibility V1Compatibility
    } `json:"history"`
}

type V1Compatibility struct {
    ID              string `json:"id"`
    Parent          string `json:"parent"`
    Created         string `json:"created"`
}
Copier après la connexion

Ensuite, effectuez le processus de démarshaling suivant :

var jsonManResp ManifestResponse

if err := json.Unmarshal([]byte(exemplar), &jsonManResp); err != nil {
    log.Fatal(err)
}

for i := range jsonManResp.History {
    var comp V1Compatibility
    if err := json.Unmarshal([]byte(jsonManResp.History[i].V1CompatibilityRaw), &comp); err != nil {
        log.Fatal(err)
    }
    jsonManResp.History[i].V1Compatibility = comp
}
Copier après la connexion

Cette approche vous permet de gérer des structures JSON imbriquées avec un -processus de démarshalage en étapes, empêchant l'erreur "Impossible de démarshaler la chaîne dans le champ Go struct".

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal