>백엔드 개발 >Golang >구조를 모르고 중첩된 JSON 데이터를 역마샬링하는 방법은 무엇입니까?

구조를 모르고 중첩된 JSON 데이터를 역마샬링하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-02 22:15:29726검색

How to Unmarshal Nested JSON Data Without Knowing Its Structure?

구조적 지식 없이 중첩 JSON 역마샬링

문제 설명

중첩 JSON 데이터를 처리할 때 , 역정렬화할 적절한 구조체를 결정하는 것이 어려울 수 있습니다. 이는 JSON 데이터의 구조가 크게 다를 수 있는 키-값 저장소에 저장된 데이터의 경우 특히 그렇습니다.

질문 1: 반복적인 언마샬링 방지

반복적인 언마샬링으로 인해 성능 오버헤드가 발생할 수 있지만 심각한 병목 현상이 발생하지 않는 한 반드시 피해야 하는 것은 아닙니다.

질문 2: 구조체 유형 결정

두 가지가 있습니다. 구조체 유형을 결정하는 주요 방법:

방법 1: 인터페이스에 대한 역마샬링

  1. json.RawMessage를 map[string]인터페이스에 대한 역마샬링{} json.Unmarshal(*objmap["foo"], &myMap)을 사용합니다.
  2. myMap에서 중첩된 JSON 데이터의 유형을 확인하세요. 데이터의 실제 유형(예: Baz, Bar)이 표시됩니다.

방법 2: 정규 표현식 사용

  1. 정규 표현식 만들기 표현식을 사용하여 중첩된 JSON 데이터에서 유형 필드를 추출합니다.
  2. regexp.FindString 함수를 사용하여 유형을 추출합니다.

구조체 유형이 결정되면 비정렬화할 수 있습니다. 데이터:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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