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 ?

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 ?

DDD
DDDoriginal
2024-11-26 21:30:11630parcourir

How to Resolve

"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!

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