「無法將字串解組到Go 結構欄位」清單解碼時出錯
從Docker API 反序列化JSON 回應時,出現錯誤「 json: 無法將字串解組到Go 結構體欄位.v1 結構體類型的兼容性{ ID字串“json:”id”;遇到父字串 "json:"parent"; 建立的字串 "json:"created""}"。
問題源自於反應結構與 Go 結構定義之間的不符。具體來說,JSON 回應中的「v1Compatibility」欄位是包含嵌套 JSON 內容的字串。 Go 結構體期望它是原生 Go 結構體,從而導致解組錯誤。
要解決此問題,可以採用兩遍解組方法:
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"` }
在第一個過程中通過,JSON 響應被解組到帶有V1CompatibilityRaw 字段的ManifestResponse 結構中populated:
var jsonManResp ManifestResponse if err := json.Unmarshal([]byte(response), &jsonManResp); err != nil { log.Fatal(err) }
在第二遍中,每個V1CompatibilityRaw字串值都被解組到對應的V1Compatibility 結構中:
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 }
透過以這種方式處理嵌套的JSON 內容,錯誤為已解決,並且正確的資料被解組到Go 結構中。
以上是如何解決 Docker Manifest 解碼中的「json:無法將字串解組到 Go 結構欄位」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!