「文字列を Go 構造体フィールドにアンマーシャルできません」マニフェスト デコードのエラー
Docker API からの JSON 応答を逆シリアル化しているときに、エラー「 json: 文字列を Go 構造体フィールドにアンマーシャリングできません。タイプ struct { ID 文字列の .v1Compatibility "json:"id";親文字列 "json:"parent"; 作成された文字列 "json:"created""}" が見つかりました。
この問題は、応答構造と Go 構造体定義の間の不一致に起因します。具体的には、JSON 応答の「v1Compatibility」フィールドは、ネストされた JSON コンテンツを含む文字列です。 Go 構造体は、それがネイティブ Go 構造体であることを期待しているため、アンマーシャリング エラーが発生します。
これを解決するには、2 パスのアンマーシャリング アプローチを使用できます。
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) }
2 番目のパスでは、各 V1CompatibilityRaw 文字列値が対応する V1Compatibility struct にアンマーシャリングされます:
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 マニフェストのデコードにおける「json: 文字列を Go 構造体フィールドにアンマーシャリングできません」エラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。