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"` }
{ "name": "library/redis", "tag": "latest", "architecture": "amd64", "history": [ { "v1Compatibility": "{\"id\":\"ef8a93741134ad37c834c32836aefbd455ad4aa4d1b6a6402e4186dfc1feeb88\",\"parent\":\"9c8b347e3807201285053a5413109b4235cca7d0b35e7e6b36554995cfd59820\",\"created\":\"2017-10-10T02:53:19.011435683Z\"}" } ] }
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\"" }
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"` }
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 }
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!