Maison  >  Article  >  développement back-end  >  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
DDDoriginal
2024-11-25 08:34:10169parcourir

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"`
}
{
    "name": "library/redis",
    "tag": "latest",
    "architecture": "amd64",
    "history": [
        {
            "v1Compatibility": "{\"id\":\"ef8a93741134ad37c834c32836aefbd455ad4aa4d1b6a6402e4186dfc1feeb88\",\"parent\":\"9c8b347e3807201285053a5413109b4235cca7d0b35e7e6b36554995cfd59820\",\"created\":\"2017-10-10T02:53:19.011435683Z\"}"
        }
    ]
}

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

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

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
}

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!

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