Docker API의 /manifests 엔드포인트(v2 스키마 1)에서 JSON 응답을 처리하는 컨텍스트에서 Go 구조체로 역직렬화하려고 시도하는 동안 오류가 발생했습니다. 오류 "json: 문자열을 Go 구조체 필드로 역마샬링할 수 없습니다. struct { ID string "json:"id""; 상위 문자열 "json:"parent""; 생성된 문자열 "json:"created"" }" 유형의 struct 필드 .v1Compatibility , 문제의 필드가 제공된 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 유형의 구조체일 것으로 예상합니다. 이 문제를 해결하려면 2단계 역마샬링 접근 방식이 필요합니다.
아래 수정된 코드는 해결 방법을 보여줍니다.
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 문자열을 중첩된 구조체 필드로 역마샬링할 수 없는 이유는 무엇이며, 2단계 역마샬링 접근 방식을 사용하여 문제를 해결하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!