Rumah > pembangunan bahagian belakang > Golang > Mengapakah struct Go saya tidak dapat menyahmarshal rentetan JSON ke dalam medan struct bersarang, dan bagaimanakah saya boleh membetulkannya menggunakan pendekatan unmarshalling dua laluan?

Mengapakah struct Go saya tidak dapat menyahmarshal rentetan JSON ke dalam medan struct bersarang, dan bagaimanakah saya boleh membetulkannya menggunakan pendekatan unmarshalling dua laluan?

Patricia Arquette
Lepaskan: 2024-12-02 07:48:15
asal
198 orang telah melayarinya

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?

Isu: Tidak Dapat Menyahmarshal Rentetan ke dalam Go Struct Field

Dalam konteks mengendalikan respons JSON daripada titik akhir /manifests Docker API (skema v2 1), satu ralat ditemui semasa cuba menyahsirikannya ke dalam struktur Go. Ralat, "json: cannot unmarshal string into Go struct field .v1Keserasian jenis struct { ID string "json:"id""; Induk rentetan "json:"parent""; Created string "json:"created"" }" , menunjukkan bahawa medan yang dipersoalkan dijangka daripada jenis yang berbeza daripada data JSON yang disediakan.

Coretan kod berikut mewakili masalah yang bermasalah bahagian:

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)
}
Salin selepas log masuk

Isu timbul kerana medan V1Compatibility ialah rentetan dalam respons JSON. Walau bagaimanapun, Golang menjangkakan ia adalah struktur jenis V1Compatibility. Untuk menyelesaikan masalah ini, pendekatan unmarshalling dua hala diperlukan.

Kod yang disemak di bawah menunjukkan penyelesaian:

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
}
Salin selepas log masuk

Dalam penyelesaian ini, medan V1CompatibilityRaw diperkenalkan untuk menampung nilai rentetan daripada respons JSON. Pas kedua unmarshalling mengisi medan V1Compatibility dengan data struktur sebenar.

Pendekatan ini membolehkan penyahserikatan respons JSON yang berjaya ke dalam struct Go yang diingini.

Atas ialah kandungan terperinci Mengapakah struct Go saya tidak dapat menyahmarshal rentetan JSON ke dalam medan struct bersarang, dan bagaimanakah saya boleh membetulkannya menggunakan pendekatan unmarshalling dua laluan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan