>백엔드 개발 >Golang >Docker 매니페스트 디코딩 시 \'json: 문자열을 Go 구조체 필드로 역마샬링할 수 없습니다\' 오류를 해결하는 방법은 무엇입니까?

Docker 매니페스트 디코딩 시 \'json: 문자열을 Go 구조체 필드로 역마샬링할 수 없습니다\' 오류를 해결하는 방법은 무엇입니까?

DDD
DDD원래의
2024-11-26 21:30:11643검색

How to Resolve

"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 구조체로 역마샬링됩니다. 채워짐:

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 매니페스트 디코딩 시 \'json: 문자열을 Go 구조체 필드로 역마샬링할 수 없습니다\' 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.