구조적 지식 없이 중첩 JSON 역마샬링
문제 설명
중첩 JSON 데이터를 처리할 때 , 역정렬화할 적절한 구조체를 결정하는 것이 어려울 수 있습니다. 이는 JSON 데이터의 구조가 크게 다를 수 있는 키-값 저장소에 저장된 데이터의 경우 특히 그렇습니다.
질문 1: 반복적인 언마샬링 방지
반복적인 언마샬링으로 인해 성능 오버헤드가 발생할 수 있지만 심각한 병목 현상이 발생하지 않는 한 반드시 피해야 하는 것은 아닙니다.
질문 2: 구조체 유형 결정
두 가지가 있습니다. 구조체 유형을 결정하는 주요 방법:
방법 1: 인터페이스에 대한 역마샬링
방법 2: 정규 표현식 사용
구조체 유형이 결정되면 비정렬화할 수 있습니다. 데이터:
varbazorbar interface{} if err := json.Unmarshal(*objmap["foo"], &bazorbar); err !=nil{ return err } switch v := bazorbar.(type) { case map[string]*json.RawMessage: // If the data is a nested JSON object, further unmarshaling is needed. result, err := unmarshalNested(v["nested_data"]) if err != nil return err foo.Nested_Data = result case []interface{}: // If the data is an array of JSON objects, process each element. for _, item := range v { result, err := unmarshalNested(item.(map[string]interface{})) if err != nil return err foo.Nested_Array = append(foo.Nested_Array, result) } }
예제 코드:
// Unmarshals nested JSON data. func unmarshalNested(data map[string]interface{}) (interface{}, error) { type_expr := regexp.MustCompile(`"type":\s*"([a-zA-Z]+)"`) matches := type_expr.FindStringSubmatch(data["foo"].(string)) if len(matches) == 2 { switch matches[1] { case "Baz": var baz Baz if err := json.Unmarshal([]byte(data["foo"].(string)), &baz); err != nil { return nil, err } return baz, nil case "Bar": var bar Bar if err := json.Unmarshal([]byte(data["foo"].(string)), &bar); err != nil { return nil, err } return bar, nil } } return nil, errors.New("cannot determine type") }
위 내용은 구조를 모르고 중첩된 JSON 데이터를 역마샬링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!