>백엔드 개발 >Golang >구조를 모르고 중첩된 JSON 데이터를 어떻게 역마샬링할 수 있나요?

구조를 모르고 중첩된 JSON 데이터를 어떻게 역마샬링할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-11-02 16:55:03471검색

How can I unmarshal nested JSON data without knowing its structure?

알려진 구조 없이 중첩된 JSON 역마샬링

정의된 구조 없이 중첩된 JSON 데이터가 있는 경우 역마샬링 문제를 완화할 수 있는 여러 가지 접근 방식이 있습니다.

반복적인 비정렬화 방지

일반적으로 비정렬화 작업을 최소화하는 것이 좋습니다. 나중에 사용할 수 있도록 비정렬화된 개체를 저장하고 반복적인 비정렬화를 방지하려면 캐싱 메커니즘을 구현하는 것이 좋습니다. 그러나 어떤 경우에는 다중 역마샬링이 필요할 수 있으며, 특히 다양한 유형의 중첩 구조를 처리할 때 더욱 그렇습니다.

비정렬화를 위한 올바른 구조체 결정

방법 1: map[string]인터페이스로 비정렬화{}

json.RawMessage를 map[string]인터페이스{}로 비정렬화합니다. 이를 통해 중첩된 구조를 검사하여 유형을 식별한 다음 정렬 해제할 올바른 구조체를 찾을 수 있습니다.

예:

<code class="go">var objMap map[string]interface{}
json.Unmarshal(rawMessage, &objMap)</code>

방법 2 : 정규식 일치

정규식을 사용하여 JSON 데이터 내의 유형 문자열을 일치시킵니다. 유형이 알려지면 리플렉션이나 유형 스위치를 사용하여 해당 구조체로 역정렬화합니다.

예:

<code class="go">type Regex *regexp.Regexp

// Split the JSON data into key-value pairs
type KeyValue struct {
    Key   string
    Value string
}

// Regex for extracting the type
var typeRE = Regex(regexp.MustCompile(`(?m)^.*"type": "(.+)".*$`))

// Unmarshal the raw message and extract the type
func getType(rawMessage []byte) (string, error) {
    var data KeyValue
    err := json.Unmarshal(rawMessage, &data)
    if err != nil {
        return "", err
    }
    matches := typeRE.FindStringSubmatch(data.Value)
    return matches[1], nil
}</code>

Copy 또는 Regular 사용 표현식 접근법

방법 A: 복사 및 비정렬화

  1. json.RawMessage의 복사본을 만듭니다.
  2. 사본을 비정렬화합니다. 인터페이스로{}하여 유형을 식별합니다.
  3. 원본 json.RawMessage를 결정된 유형의 구조체로 역마샬링합니다.

방법 B: 정규 표현식 및 역마샬링

  1. 정규식을 사용하여 유형을 결정합니다.
  2. 리플렉션이나 유형 스위치를 사용하여 결정된 유형으로 구조체의 새 인스턴스를 만듭니다.
  3. 새로 생성된 구조체에 json.RawMessage를 역마샬링합니다.

위 내용은 구조를 모르고 중첩된 JSON 데이터를 어떻게 역마샬링할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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