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는 유연성을 제공하지만 데이터 구조를 수동으로 처리해야 하며 적합하지 않을 수 있습니다. 모든 경우에. 대체 접근 방식은 다음과 같습니다.
가장 좋은 접근 방식은 애플리케이션의 특정 요구 사항과 JSON의 복잡성에 따라 다릅니다. 데이터.
위 내용은 Go에서 가변 JSON 구조를 효율적으로 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!