Rumah > pembangunan bahagian belakang > Golang > Bagaimana Mengendalikan Struktur JSON Bersarang dan Mengelakkan Ralat \'tidak boleh unmarshal rentetan ke dalam medan struct Go\'?

Bagaimana Mengendalikan Struktur JSON Bersarang dan Mengelakkan Ralat \'tidak boleh unmarshal rentetan ke dalam medan struct Go\'?

DDD
Lepaskan: 2024-11-25 08:34:10
asal
222 orang telah melayarinya

How to Handle Nested JSON Structures and Avoid

Menyahmarshall JSON dengan Nested Structures

Apabila bekerja dengan respons JSON yang kompleks, kadangkala anda mungkin menghadapi ralat seperti "tidak boleh unmarshal rentetan ke dalam medan struct Go ". Ini biasanya berlaku apabila respons JSON mengandungi nilai rentetan yang mewakili struktur JSON yang lain.

Pertimbangkan ManifestResponse struct Go yang tidak lengkap ini dan respons JSON yang sepadan:

type ManifestResponse struct {
    Name         string `json:"name"`
    Tag          string `json:"tag"`
    Architecture string `json:"architecture"`

    FsLayers []struct {
        BlobSum string `json:"blobSum"`
    } `json:"fsLayers"`

    History []struct {
        V1Compatibility struct {
            ID              string `json:"id"`
            Parent          string `json:"parent"`
            Created         string `json:"created"`
        } `json:"v1Compatibility"`
    } `json:"history"`
}
Salin selepas log masuk
{
    "name": "library/redis",
    "tag": "latest",
    "architecture": "amd64",
    "history": [
        {
            "v1Compatibility": "{\"id\":\"ef8a93741134ad37c834c32836aefbd455ad4aa4d1b6a6402e4186dfc1feeb88\",\"parent\":\"9c8b347e3807201285053a5413109b4235cca7d0b35e7e6b36554995cfd59820\",\"created\":\"2017-10-10T02:53:19.011435683Z\"}"
        }
    ]
}
Salin selepas log masuk

Apabila cuba untuk unmarshal JSON ke dalam struct Go, anda mungkin menghadapi perkara berikut ralat:

json: cannot unmarshal string into Go struct field .v1Compatibility of type struct { ID string "json:\"id\""; Parent string "json:\"parent\""; Created string "json:\"created\"" }
Salin selepas log masuk

Isu ini berpunca daripada fakta bahawa Keserasian v1 dalam respons JSON ialah nilai rentetan yang mengandungi kandungan JSON. Untuk menangani perkara ini, kami boleh melaksanakan unmarshaling dua laluan:

type ManifestResponse struct {
    Name         string `json:"name"`
    Tag          string `json:"tag"`
    Architecture string `json:"architecture"`

    FsLayers []struct {
        BlobSum string `json:"blobSum"`
    } `json:"fsLayers"`

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

Kemudian lakukan proses unmarshaling berikut:

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

Pendekatan ini membolehkan anda mengendalikan struktur JSON bersarang dengan dua -langkah proses unmarshaling, menghalang ralat "cannot unmarshal string into Go struct field".

Atas ialah kandungan terperinci Bagaimana Mengendalikan Struktur JSON Bersarang dan Mengelakkan Ralat \'tidak boleh unmarshal rentetan ke dalam medan struct Go\'?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan