Heim > Backend-Entwicklung > Golang > Warum 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?

Warum 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?

Patricia Arquette
Freigeben: 2024-12-02 07:48:15
Original
194 Leute haben es durchsucht

Why is my Go struct unable to unmarshal a JSON string into a nested struct field, and how can I fix it using a two-pass unmarshalling approach?

Problem: String kann nicht in das Go-Struct-Feld entmarshaliert werden

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)
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage