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) }
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 }
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!