>백엔드 개발 >Golang >내 Go 구조체가 JSON 문자열을 중첩된 구조체 필드로 역마샬링할 수 없는 이유는 무엇이며, 2단계 역마샬링 접근 방식을 사용하여 문제를 해결하려면 어떻게 해야 합니까?

내 Go 구조체가 JSON 문자열을 중첩된 구조체 필드로 역마샬링할 수 없는 이유는 무엇이며, 2단계 역마샬링 접근 방식을 사용하여 문제를 해결하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-02 07:48:15195검색

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 구조체 필드로 역마샬링할 수 없습니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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