> 백엔드 개발 > Golang > Go에서 JSON을 언마샬링할 때 변수 배열 반환을 처리하는 방법은 무엇입니까?

Go에서 JSON을 언마샬링할 때 변수 배열 반환을 처리하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-12 12:49:10
원래의
250명이 탐색했습니다.

How to Handle Variable Array Returns When Unmarshalling JSON in Go?

가변 배열 반환으로 JSON 역마샬링

외부 소스에서 JSON을 검색할 때 응답 구조가 다양할 수 있으므로 역마샬링이 어려울 수 있습니다. 고정된 Go 구조체로. 이는 JSON에 동일한 속성에 대한 배열 또는 단일 개체가 포함될 수 있는 경우 특히 분명합니다.

제공된 예에서 JSON 응답에는 개체 배열 또는 개체 배열일 수 있는 "gwrcmd"라는 속성이 포함되어 있습니다. 단일 개체. 이 문제를 해결하기 위한 한 가지 접근 방식은 원본과 동일한 필드를 사용하지만 "gwrcmd" 속성에 대한 슬라이스를 사용하여 두 번째 구조체를 만드는 것입니다. 그러나 json.RawMessage를 사용하면 보다 유연한 솔루션을 얻을 수 있습니다.

json.RawMessage를 사용하면 알 수 없는 유형을 원시 JSON 문자열로 역마샬링할 수 있습니다. 이 기능을 사용하면 JSON을 엿보고 이를 해당 Go 유형으로 역마샬링하는 적절한 방법을 결정할 수 있습니다.

다음의 간단한 예를 고려하세요.

type Response struct {
    RawAWrapper struct {
        RawA json.RawMessage `json:"a"`
    }
    A  A   `json:"-"`
    As []A `json:"-"`
}

type A struct {
    B string
}

func (r *Response) UnmarshalJSON(b []byte) error {
    if err := json.Unmarshal(b, &r.RawAWrapper); err != nil {
        return err
    }
    if r.RawAWrapper.RawA[0] == '[' {
        return json.Unmarshal(r.RawAWrapper.RawA, &r.As)
    }
    return json.Unmarshal(r.RawAWrapper.RawA, &r.A)
}
로그인 후 복사

이 예에서 json.RawMessage 필드 RawA는 "a" 속성의 JSON 값을 캡처합니다. 원시 JSON의 첫 번째 바이트를 기반으로 값이 배열([])인지 객체("{")인지 확인할 수 있습니다. 그런 다음 이 정보는 값을 A 구조체(객체의 경우) 또는 As 슬라이스(배열의 경우)로 역마샬링하는 데 사용됩니다.

이 접근 방식은 변수 구조로 JSON 응답을 처리하는 보다 유연하고 강력한 방법을 제공합니다. 중복된 구조체가 필요 없으며 JSON 콘텐츠를 기반으로 동적 역마샬링이 가능합니다.

위 내용은 Go에서 JSON을 언마샬링할 때 변수 배열 반환을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿