가변 배열 반환으로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!