Maison > Article > développement back-end > Comment résoudre l'erreur « json : impossible de désassembler la chaîne dans le champ de structure Go » dans le décodage du manifeste Docker ?
"Impossible de désérialiser la chaîne dans le champ de structure Go" Erreur dans le décodage du manifeste
Lors de la désérialisation d'une réponse JSON à partir de l'API Docker, l'erreur " json : impossible de regrouper la chaîne dans le champ de structure Go .v1Compatibilité du type struct { chaîne d'ID "json :"identifiant" ; La chaîne parent "json:"parent" ; la chaîne créée "json:"created""}" est rencontrée.
Le problème provient d'une inadéquation entre la structure de réponse et la définition de la structure Go. Plus précisément, le champ « v1Compatibility » dans la réponse JSON est une chaîne contenant du contenu JSON imbriqué. La structure Go s'attend à ce qu'il s'agisse d'une structure Go native, ce qui entraîne l'erreur de démarshalling.
Pour résoudre ce problème, une approche de démarshalling en deux passes peut être utilisée :
type ManifestResponse struct { Name string `json:"name"` Tag string `json:"tag"` Architecture string `json:"architecture"` FsLayers []FSLayer `json:"fsLayers"` History []HistEntry } type FSLayer struct { BlobSum string `json:"blobSum"` } type HistEntry struct { V1CompatibilityRaw string `json:"v1Compatibility"` V1Compatibility V1Compatibility `json:"-"` } type V1Compatibility struct { ID string `json:"id"` Parent string `json:"parent"` Created string `json:"created"` }
Au cours de la première réussi, la réponse JSON n'est pas marshallée dans la structure ManifestResponse avec le champ V1CompatibilityRaw peuplé :
var jsonManResp ManifestResponse if err := json.Unmarshal([]byte(response), &jsonManResp); err != nil { log.Fatal(err) }
Au cours de la deuxième passe, chaque valeur de chaîne V1CompatibilityRaw est désorganisée dans la structure V1Compatibility correspondante :
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 }
En gérant le contenu JSON imbriqué de cette manière, l'erreur est résolu et les données correctes ne sont pas rassemblées dans la structure Go.
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!