구조를 알 수 없는 중첩 JSON 역마샬링
이 시나리오에서는 키-값에 저장된 알 수 없는 구조의 JSON 데이터를 다루고 있습니다. 가게. 데이터베이스에서 항목을 검색할 때 처음에는 최상위 네임스페이스를 처리하기 위해 map[string]*json.RawMessage로 역마샬링합니다. 그러나 중첩된 데이터를 추가로 역마샬링하려면 사용할 특정 구조체를 결정해야 합니다.
1. 반복적인 비정렬화 방지:
반복적인 비정렬화는 잠재적으로 성능에 영향을 미칠 수 있습니다. 그러나 데이터 구조 및 접근 패턴에 따라 필요할 수도 있습니다. 언마샬링 속도가 중요한 경우에는 언마샬링된 결과를 캐싱하는 것을 고려해 보세요.
2. 구조체 유형 결정:
방법 A: 인터페이스로 비정렬화
방법 B: 정규 표현식
예:
방법 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!