首頁 > 後端開發 > Golang > 主體

如何高效率解組未知結構的巢狀 JSON?

Mary-Kate Olsen
發布: 2024-11-04 05:02:29
原創
351 人瀏覽過

How to Unmarshall Nested JSON with Unknown Structure Efficiently?

解組具有未知結構的巢狀JSON

在這種情況下,我們正在處理儲存在鍵值中的具有未知結構的JSON 資料店鋪。從資料庫檢索條目時,我們最初解組為 map[string]*json.RawMessage 來處理頂級命名空間。然而,為了進一步解組嵌套數據,我們需要確定要使用的特定結構。

1.避免重複解組:

重複解組可能會影響效能。但是,根據資料結構和存取模式,這可能是必要的。如果解組速度至關重要,請考慮快取解組結果。

2.確定結構類型:

方法A:解組到介面

  • 將json.RawMage解組到map[string]interface{}。
  • 檢查與「type」鍵關聯的值。
  • 使用 switch 語句或反射來決定正確的結構。

方法 B:常規表達式

  • 使用正規表示式從 JSON 資料中提取「type」字串。
  • 建立與可能的「type」字串關聯的結構類型對應。
  • 將 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>
登入後複製

方法

<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學習者快速成長!