首頁 >後端開發 >Golang >如何解決 Docker Manifest 解碼中的「json:無法將字串解組到 Go 結構欄位」錯誤?

如何解決 Docker Manifest 解碼中的「json:無法將字串解組到 Go 結構欄位」錯誤?

DDD
DDD原創
2024-11-26 21:30:11642瀏覽

How to Resolve

「無法將字串解組到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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn