在處理來自Docker API 的/manifests 端點(v2 架構1)的JSON 回應時,嘗試將其反序列化為Go 結構時遇到錯誤。錯誤,「json:無法將字串解組到Go 結構欄位.v1Compatibility of type struct { ID string "json:"id""; Parent string "json:"parent""; Created string "json:"created"" }" ,表示相關欄位的類型應與提供的JSON 資料不同。
以下程式碼片段代表有問題的部分:
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) }
出現此問題的原因是欄位 V1Compatibility 是 JSON 回應中的字串。然而,Golang 希望它是一個 V1Compatibility 型別的結構。為了解決這個問題,需要採用兩遍解組方法。
下面修改後的程式碼示範了解決方法:
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 }
在此解決方案中,引入了 V1CompatibilityRaw 欄位來容納字串值來自 JSON 回應。解組的第二遍用實際的結構資料填入 V1Compatibility 欄位。
此方法可以將 JSON 回應成功反序列化為所需的 Go 結構。
以上是為什麼我的 Go 結構無法將 JSON 字串解組到巢狀結構欄位中,如何使用兩遍解組方法修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!