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 중국어 웹사이트의 기타 관련 기사를 참조하세요!