首頁 > 後端開發 > Golang > 為什麼我的 Go 結構無法將 JSON 字串解組到巢狀結構欄位中,如何使用兩遍解組方法修復它?

為什麼我的 Go 結構無法將 JSON 字串解組到巢狀結構欄位中,如何使用兩遍解組方法修復它?

Patricia Arquette
發布: 2024-12-02 07:48:15
原創
194 人瀏覽過

Why is my Go struct unable to unmarshal a JSON string into a nested struct field, and how can I fix it using a two-pass unmarshalling approach?

問題:無法將字串解組到Go Struct 欄位

在處理來自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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板