首頁  >  文章  >  後端開發  >  如何高效率解組未知結構的巢狀 JSON?

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-04 05:02:29409瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn