>  기사  >  백엔드 개발  >  코드 값을 기반으로 JSON 데이터를 동적으로 역정렬화하는 방법은 무엇입니까?

코드 값을 기반으로 JSON 데이터를 동적으로 역정렬화하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-31 04:22:02838검색

How to Unmarshall JSON Data Dynamically Based on a Code Value?

임의 데이터 비정렬화

많은 시나리오에서 비정렬화 프로세스가 다양한 상황에 적응할 수 있도록 유연한 방식으로 JSON 데이터를 비정렬화해야 합니다. 미리 결정된 코드 값을 기반으로 한 데이터 구조. 이를 통해 다양한 소스에서 수신된 데이터를 동적으로 해석할 수 있습니다.

예를 들어, "페이로드" 필드에 포함된 데이터 유형을 지정하는 "코드" 필드가 포함된 JSON 메시지를 생각해 보세요. "페이로드" 필드는 "코드" 값에 따라 다른 데이터 구조를 나타낼 수 있습니다.

이를 달성하기 위해 다음 기술을 사용할 수 있습니다.

<code class="go">package main

import (
    "encoding/json"
    "fmt"
)

type Message struct {
    Code    int
    Payload json.RawMessage // delay parsing until we know the code
}

// Define the possible data structures that can be unmarshalled from the "payload" field
type Range struct {
    Start int
    End   int
}
type User struct {
    ID   int
    Pass int
}

// Custom unmarshalling function
func MyUnmarshall(m []byte) {
    var message Message
    var payload interface{}
    json.Unmarshal(m, &message) // delay parsing until we know the color space

    // Determine the data structure based on the "code" field
    switch message.Code {
    case 3:
        payload = new(User)
    case 4:
        payload = new(Range)
    }

    // Unmarshall the "payload" field into the appropriate data structure
    json.Unmarshal(message.Payload, payload) //err check ommited for readability

    // Do something with the unmarshalled data
    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>

이 예에서 MyUnmarshall 함수는 JSON 메시지를 수신하고 "코드" 및 "페이로드" 필드를 메시지 구조체에 저장한 다음 "코드" 값을 기반으로 데이터 구조 인스턴스를 동적으로 생성합니다. 이후 "페이로드" 필드를 적절한 구조로 역마샬링하고 역마샬링된 데이터에 대해 원하는 작업을 수행합니다.

위 내용은 코드 값을 기반으로 JSON 데이터를 동적으로 역정렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.