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!