JSON 및 Go를 사용하여 임의 데이터 역마샬링
특정 요구 사항이 있습니다. 부품이나 섹션. 이를 달성하기 위해 데이터의 전반부 또는 "코드"가 후반부를 해석하는 방법을 나타내는 구조를 구상하고 있습니다. 하반기에 사용할 수 있는 두 가지 구조체는 Range와 User입니다.
도전
Go의 기존 json 패키지는 정의된 구조체를 마샬링 및 언마샬링하는 데 편리한 기능을 제공하지만 임의의 데이터에 대한 요구 사항을 충족하지 않습니다.
솔루션 디코딩
이 솔루션에는 메시지 구조체에 json.RawMessage 필드(페이로드)를 도입하는 작업이 포함됩니다. 이 필드를 사용하면 전반부에 지정된 코드를 알 때까지 데이터 구문 분석을 지연할 수 있습니다.
다음은 Go에서 구현한 예입니다.
<code class="go">type Message struct { Code int Payload json.RawMessage } type Range struct { Start int End int } type User struct { ID int Pass int } // Custom unmarshalling function func MyUnmarshall(m []byte) { var message Message json.Unmarshal(m, &message) var payload interface{} switch message.Code { case 3: payload = new(User) case 4: payload = new(Range) } json.Unmarshal(message.Payload, payload) }</code>
사용법
먼저 json.Unmarshal 함수를 사용하여 "상위 절반"을 비정렬화하여 이 솔루션을 사용합니다. 그런 다음 "상부 절반"에서 검색된 코드를 기반으로 다시 json.Unmarshal 함수를 사용하여 "하부 절반"을 비마샬링합니다. 이번에는 대상 json.RawMessage 객체를 제공합니다.
예
<code class="go">json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`) MyUnmarshall(json) // This will decode the data into a Range object</code>
고려사항
이 기술을 사용하면 구조적이고 유연한 방식으로 임의 데이터 언마샬링을 처리할 수 있습니다. 그러나 코드를 미리 알고 다양한 코드에 일치하는 구조체가 있는지에 대한 런타임 종속성이 발생합니다.
위 내용은 동적 코드 기반 스키마를 사용하여 Go에서 임의 JSON 데이터를 정렬 해제하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!