>백엔드 개발 >Golang >Go에서 가변 JSON 구조를 효율적으로 처리하는 방법은 무엇입니까?

Go에서 가변 JSON 구조를 효율적으로 처리하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-22 03:26:57513검색

How to Efficiently Handle Variable JSON Structures in Go?

Go에서 변수 구조를 사용하여 JSON 데이터 디코딩

타사 소스의 JSON 데이터로 작업할 때 다음과 같은 시나리오가 발생하는 것은 드문 일이 아닙니다. 데이터의 구조는 다를 수 있습니다. 이는 JSON을 특정 데이터 유형으로 역마샬링하기 위해 구조체를 사용하는 Go 프로그램에 대한 문제를 제시합니다.

JSON 응답이 "gwrcmd"와 같은 특정 속성 내의 단일 요소 또는 배열을 포함할 수 있는 경우를 생각해 보십시오. 이 예에서는. "gwrcmd"가 항상 단일 요소인 경우 다음과 같은 구조체가 적합합니다.

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

그러나 "gwrcmd"가 때때로 배열인 경우 정렬 해제 중에 오류가 발생합니다.

유연성을 위해 json.RawMessage 사용

A 가변 구조 JSON 데이터를 처리하는 일반적인 접근 방식은 json.RawMessage를 사용하는 것입니다. 이를 통해 특정 유형을 지정하지 않고 임의의 JSON 값을 캡처할 수 있습니다. 원시 값이 있으면 이를 검사하고 추가로 역정렬화하는 방법을 결정할 수 있습니다.

type Response struct {
    Gwrcmds struct {
        Gwrcmd json.RawMessage
    }
}

응답 구조체에 대한 UnmarshalJSON 메서드에서 Gwrcmd의 내용을 검사하고 적절한 위치로 역정렬화할 수 있습니다. type:

func (r *Response) UnmarshalJSON(b []byte) error {
    if err := json.Unmarshal(b, &r.Gwrcmds); err != nil {
        return err
    }
    if r.Gwrcmds.Gwrcmd[0] == '[' {
        return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsArray)
    }
    return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsSingle)
}

이 경우에는 별도의 필드를 생성하여 배열 및 단일 요소 시나리오를 모두 처리하고 원시 값의 내용을 기반으로 역정렬화합니다.

대체 접근 방식

json.RawMessage는 유연성을 제공하지만 데이터 구조를 수동으로 처리해야 하며 적합하지 않을 수 있습니다. 모든 경우에. 대체 접근 방식은 다음과 같습니다.

  • 인터페이스 사용: 배열과 단일 요소 사례 간의 공통 동작을 캡슐화하는 인터페이스를 정의한 다음 구조체 정의에서 인터페이스 유형을 사용합니다.
  • 별도의 구조체 생성: 문제에서 제안한 대로 별도의 구조체를 생성합니다. 배열 및 단일 요소 시나리오에 대한 구조체를 생성하고 UnmarshalJSON 메서드의 유형 어설션을 사용하여 사용할 구조체를 결정합니다.

가장 좋은 접근 방식은 애플리케이션의 특정 요구 사항과 JSON의 복잡성에 따라 다릅니다. 데이터.

위 내용은 Go에서 가변 JSON 구조를 효율적으로 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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