首頁  >  文章  >  後端開發  >  如何在不知道其結構的情況下解組嵌套 JSON 資料?

如何在不知道其結構的情況下解組嵌套 JSON 資料?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-02 22:15:29627瀏覽

How to Unmarshal Nested JSON Data Without Knowing Its Structure?

在沒有結構知識的情況下解組嵌套JSON

問題陳述

處理嵌套JSON 資料時,確定要解組到的適當結構可能具有挑戰性。對於儲存在鍵值儲存中的資料尤其​​如此,其中 JSON 資料的結構可能差異很大。

問題 1:避免重複解組

而重複解組可能會產生一些效能開銷,但不一定要避免,除非它成為重大瓶頸。

問題2:確定結構類型

有兩個確定結構類型的主要方法:

方法1:解組到介面

  1. 解組json.RawMessage 到map[string]interface{}使用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