Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyelesaikan \'json: tidak boleh unmarshal rentetan ke dalam medan Go struct\' Ralat dalam Penyahkodan Manifes Docker?

Bagaimana untuk Menyelesaikan \'json: tidak boleh unmarshal rentetan ke dalam medan Go struct\' Ralat dalam Penyahkodan Manifes Docker?

DDD
DDDasal
2024-11-26 21:30:11746semak imbas

How to Resolve

"tidak boleh menyahmarshal rentetan ke dalam medan struct Go" Ralat dalam Penyahkodan Manifes

Semasa menyahsiri respons JSON daripada Docker API, ralat " json: tidak boleh membuka rentetan ke dalam medan Go struct .v1Keserasian jenis struct { rentetan ID "json:"id"; Rentetan induk "json:"parent"; Rentetan yang dibuat "json:"created""}" ditemui.

Isu ini berpunca daripada ketidakpadanan antara struktur respons dan definisi struct Go. Khususnya, medan "v1Compatibility" dalam respons JSON ialah rentetan yang mengandungi kandungan JSON bersarang. Struk Go menjangkakan ia sebagai struct Go asli, yang membawa kepada ralat unmarshalling.

Untuk menyelesaikan masalah ini, pendekatan unmarshalling dua hala boleh digunakan:

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

Semasa yang pertama lulus, tindak balas JSON tidak dikawal ke dalam struct ManifestResponse dengan medan V1CompatibilityRaw dihuni:

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

Dalam laluan kedua, setiap nilai rentetan V1CompatibilityRaw tidak digabungkan ke dalam struct V1Compatibility yang sepadan:

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
}

Dengan mengendalikan kandungan JSON bersarang dengan cara ini, ralatnya ialah diselesaikan, dan data yang betul dibongkar ke dalam struct Go.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan \'json: tidak boleh unmarshal rentetan ke dalam medan Go struct\' Ralat dalam Penyahkodan Manifes Docker?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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