
임의 JSON 데이터 정렬 해제
질문:
JSON 데이터를 어떤 방식으로든 정렬할 수 있나요? 부분이나 섹션에서 비정렬화할 수 있습니까? 이 시나리오에서 데이터의 위쪽 절반은 아래쪽 절반의 데이터 유형을 나타내는 "코드"를 정의하며, 이는 구조체마다 다를 수 있습니다. Go에서 이를 어떻게 달성할 수 있나요?
답변:
하위 절반이 구조체마다 다를 수 있는 임의 JSON 데이터를 비정렬화하려면 다음이 될 때까지 하위 절반 구문 분석을 지연하면 됩니다. 위쪽 절반의 "코드"가 알려져 있습니다.
구현:
- int Code 필드와 json.RawMessage 페이로드 필드를 사용하여 메시지 구조체를 정의합니다. . 이 필드는 구문 분석되지 않은 아래쪽 절반을 임시로 저장합니다.
- 코드를 기반으로 다양한 구조체 유형을 구문 분석하고 정렬 해제하는 함수를 만듭니다.
- JSON 데이터에서 메시지 구조체를 정렬 해제합니다. 그러면 데이터의 위쪽 절반이 구문 분석되고 아래쪽 절반의 구문 분석이 지연됩니다.
- 코드를 기반으로 적절한 구조체 유형의 인스턴스를 생성하고 거기에 페이로드를 언마샬링합니다.
예제 코드:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <code class = "go" >package main
import (
"encoding/json"
"fmt"
)
type Message struct {
Code int
Payload json.RawMessage
}
type Range struct {
Start int
End int
}
type User struct {
ID int
Pass int
}
func MyUnmarshall(m []byte) {
var message Message
var payload interface {}
json.Unmarshal(m, &message)
switch message.Code {
case 3:
payload = new (User)
case 4:
payload = new (Range)
}
json.Unmarshal(message.Payload, payload)
fmt.Printf( "\n%v%+v" , message.Code, payload)
}
func main() {
json := []byte(`{ "Code" : 4, "Payload" : { "Start" : 1, "End" : 10}}`)
MyUnmarshall(json)
json = []byte(`{ "Code" : 3, "Payload" : { "ID" : 1, "Pass" : 1234}}`)
MyUnmarshall(json)
}</code>
|
로그인 후 복사
위 내용은 \'코드\'를 기반으로 다양한 구조를 사용하여 임의 JSON 데이터를 비정렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!