동적 코드 기반 스키마를 사용하여 Go에서 임의 JSON 데이터를 정렬 해제하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-01 08:22:30
원래의
679명이 탐색했습니다.

How to Unmarshall Arbitrary JSON Data in Go with a Dynamic Code-Driven Schema?

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!