Heim >Backend-Entwicklung >Golang >Wie behebt man den Fehler „json: string into Go struct field kann nicht entmarshaliert werden' in der Docker-Manifest-Dekodierung?

Wie behebt man den Fehler „json: string into Go struct field kann nicht entmarshaliert werden' in der Docker-Manifest-Dekodierung?

DDD
DDDOriginal
2024-11-26 21:30:11643Durchsuche

How to Resolve

„Zeichenfolge kann nicht in Go-Strukturfeld entmarshaliert werden“ Fehler bei der Manifest-Dekodierung

Beim Deserialisieren einer JSON-Antwort von der Docker-API wird der Fehler „ json: String kann nicht in das Go-Strukturfeld entmarshaliert werden. .v1Compatibility of type struct { ID string "json:"id"; Übergeordneter String „json:“parent“; Erstellter String „json:“created“}“ ist aufgetreten.

Das Problem ist auf eine Nichtübereinstimmung zwischen der Antwortstruktur und der Go-Strukturdefinition zurückzuführen. Insbesondere ist das Feld „v1Compatibility“ in der JSON-Antwort eine Zeichenfolge, die verschachtelten JSON-Inhalt enthält. Die Go-Struktur erwartet, dass es sich um eine native Go-Struktur handelt, was zum Unmarshalling-Fehler führt.

Um dieses Problem zu beheben, kann ein Unmarshalling-Ansatz mit zwei Durchgängen verwendet werden:

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

Während des ersten Durchlaufen wird die JSON-Antwort mit dem V1CompatibilityRaw-Feld in die ManifestResponse-Struktur entmarshallt bevölkert:

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

Im zweiten Durchgang wird jeder V1CompatibilityRaw-Stringwert in die entsprechende V1Compatibility-Struktur entmarshallt:

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
}

Durch die Behandlung des verschachtelten JSON-Inhalts auf diese Weise wird der Fehler behoben aufgelöst und die richtigen Daten werden in die Go-Struktur entmarshallt.

Das obige ist der detaillierte Inhalt vonWie behebt man den Fehler „json: string into Go struct field kann nicht entmarshaliert werden' in der Docker-Manifest-Dekodierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn