알 수 없는 구조로 중첩된 JSON을 효율적으로 비정렬화하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-04 05:02:29
원래의
347명이 탐색했습니다.

How to Unmarshall Nested JSON with Unknown Structure Efficiently?

구조를 알 수 없는 중첩 JSON 역마샬링

이 시나리오에서는 키-값에 저장된 알 수 없는 구조의 JSON 데이터를 다루고 있습니다. 가게. 데이터베이스에서 항목을 검색할 때 처음에는 최상위 네임스페이스를 처리하기 위해 map[string]*json.RawMessage로 역마샬링합니다. 그러나 중첩된 데이터를 추가로 역마샬링하려면 사용할 특정 구조체를 결정해야 합니다.

1. 반복적인 비정렬화 방지:

반복적인 비정렬화는 잠재적으로 성능에 영향을 미칠 수 있습니다. 그러나 데이터 구조 및 접근 패턴에 따라 필요할 수도 있습니다. 언마샬링 속도가 중요한 경우에는 언마샬링된 결과를 캐싱하는 것을 고려해 보세요.

2. 구조체 유형 결정:

방법 A: 인터페이스로 비정렬화

  • json.RawMessage를 맵[문자열]인터페이스로 비정렬화합니다{}.
  • "type"과 관련된 값을 확인하세요. key.
  • switch 문이나 리플렉션을 사용하여 올바른 구조체를 결정합니다.

방법 B: 정규 표현식

  • 사용 JSON 데이터에서 "유형" 문자열을 추출하는 정규 표현식.
  • 연관된 구조체 유형의 맵 생성 가능한 "유형" 문자열을 사용합니다.
  • json.RawMessage를 해당 구조체로 역마샬링합니다.

예:

방법 A:

<code class="go">type RawData struct {
    Id       string `json:"id"`
    Type      string `json:"type"`
    RawData   []int  `json:"rawdata"`
    Epoch     string `json:"epoch"`
}

// Unmarshal to interface
data := make(map[string]interface{})
json.Unmarshal(*objmap["foo"], &data)

// Determine struct type
switch data["type"] {
case "baz":
    baz := &RawData{}
    json.Unmarshal(*objmap["foo"], baz)
case "bar":
    bar := &BarData{}
    json.Unmarshal(*objmap["foo"], bar)
}

// Custom struct for nested data
type BarData struct {
    Id       string `json:"id"`
    Type      string `json:"type"`
    RawData   []QuxData  `json:"rawdata"`
    Epoch     string `json:"epoch"`
}

type QuxData struct{
    Key string `json:"key"`
    Values []int `json:"values`
}</code>
로그인 후 복사

방법 B:

<code class="go">// Regular expression to extract type
typeRegex := regexp.MustCompile(`"type": "(.+?)"`)

// Get "type" string
typeString := string(typeRegex.Find(*objmap["foo"]))

// Map of struct types
structMap := map[string]interface{}{
    "baz": &RawData{},
    "bar": &BarData{},
}

// Unmarshal to corresponding struct
dataStruct := structMap[typeString]
json.Unmarshal(*objmap["foo"], dataStruct)</code>
로그인 후 복사

이러한 방법 중 하나를 구현하면 json을 비정렬화하는 올바른 구조체를 결정할 수 있습니다. RawMessage를 사용하면 중첩된 데이터에 효율적으로 액세스할 수 있습니다.

위 내용은 알 수 없는 구조로 중첩된 JSON을 효율적으로 비정렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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