Im Zusammenhang mit der Verarbeitung einer JSON-Antwort vom /manifests-Endpunkt der Docker-API (v2-Schema 1) wurde ein Beim Versuch, es in eine Go-Struktur zu deserialisieren, ist ein Fehler aufgetreten. Der Fehler „json: string into Go struct field .v1Compatibility of type struct { ID string „json:“id““; Parent string „json:“parent““; Created string „json:“created“ }“ kann nicht entmarshaliert werden. , gibt an, dass das betreffende Feld voraussichtlich einen anderen Typ hat als die bereitgestellten JSON-Daten.
Der folgende Codeausschnitt stellt das Problem dar Abschnitt:
type ManifestResponse struct { // ... other fields History []struct { V1Compatibility struct { ID string `json:"id"` Parent string `json:"parent"` Created string `json:"created"` } `json:"v1Compatibility"` } `json:"history"` } // ... if err = json.NewDecoder(res.Body).Decode(&jsonManResp); err != nil { log.Fatal(err) }
Das Problem tritt auf, weil das Feld V1Compatibility eine Zeichenfolge in der JSON-Antwort ist. Golang erwartet jedoch, dass es sich um eine Struktur vom Typ V1Compatibility handelt. Um dieses Problem zu lösen, ist ein Unmarshalling-Ansatz in zwei Durchgängen erforderlich.
Der überarbeitete Code unten zeigt die Problemumgehung:
type ManifestResponse struct { // ... other fields 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"` } // ... 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 }
In dieser Lösung wird das Feld V1CompatibilityRaw eingeführt, um den Zeichenfolgewert aufzunehmen aus der JSON-Antwort. Der zweite Durchlauf des Unmarshalling füllt das V1Compatibility-Feld mit den tatsächlichen Strukturdaten.
Dieser Ansatz ermöglicht eine erfolgreiche Deserialisierung der JSON-Antwort in die gewünschte Go-Struktur.
Das obige ist der detaillierte Inhalt vonWarum ist meine Go-Struktur nicht in der Lage, eine JSON-Zeichenfolge in ein verschachteltes Strukturfeld zu entmarshallieren, und wie kann ich das Problem mit einem Unmarshalling-Ansatz in zwei Durchgängen beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!