>백엔드 개발 >Golang >데이터가 배열이거나 객체일 수 있는 경우 JSON 역마샬링을 처리하는 방법은 무엇입니까?

데이터가 배열이거나 객체일 수 있는 경우 JSON 역마샬링을 처리하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-13 19:00:13396검색

How to Handle JSON Unmarshalling When the Data Might Be an Array or an Object?

JSON을 배열 또는 개체로 비정렬화하는 방법

JSON을 처리할 때 반환된 데이터가 배열 또는 개체일 수 있는 시나리오를 처리합니다. 개체가 어려울 수 있습니다. 이 문서에서는 문제를 다루고 json.RawMessage 유형을 사용하고 JSON 구조를 기반으로 하는 동적 역마샬링을 포함하는 솔루션을 제시합니다.

동적 JSON 구조 공개

고려하세요. 다음 JSON 응답:

{"gwrcmds":{"gwrcmd":{"gcmd":"SPA_UserGetSmartMeterList","gdata":{"gip":{"version":"1"
{"gwrcmds":{"gwrcmd":[{"gcmd":"DeviceGetChart","gdata":{"gip":{"version":"1"

응답에서 볼 수 있듯이, gwrcmd는 객체이거나 배열일 수 있습니다. 이를 설명하기 위해 사용자 정의 Go 구조체는 다음과 같이 정의됩니다.

type Response struct {
    Gwrcmds struct {
        Gwrcmd struct {
            Gcmd  string
            Gdata struct {
                Gip struct {
                    Version string

언마샬링 난제 해결

이 문제를 해결하는 열쇠는 json.RawMessage를 활용하는 데 있습니다. , 모든 JSON 값을 허용합니다. 원시 JSON을 보관하기 위해 Response 구조체 내에 래퍼를 생성합니다.

type Response struct {
    RawAWrapper struct {
        RawA json.RawMessage `json:"a"`
    }

JSON 구조를 기반으로 한 동적 역마샬링

Response 구조체의 UnmarshalJSON 메서드 내에서, RawAWrapper.RawA의 첫 번째 바이트를 검사하여 배열 또는 객체를 나타내는지 확인합니다. 결과에 따라 그에 따라 데이터를 역마샬링합니다.

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을 처리할 수 있는 유연성을 제공합니다.

위 내용은 데이터가 배열이거나 객체일 수 있는 경우 JSON 역마샬링을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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