首頁 >後端開發 >Golang >如何安全地將 JSON 解組到 Interface{} 並處理類型斷言?

如何安全地將 JSON 解組到 Interface{} 並處理類型斷言?

Linda Hamilton
Linda Hamilton原創
2024-12-17 11:59:25556瀏覽

How to Safely Unmarshal JSON into an Interface{} and Handle Type Assertion?

解組到介面{}並執行型別斷言

將 JSON 解組到介面{}可以處理多種資料型別。然而,直接斷言已解封的 interface{} 的類型會帶來挑戰。

在給定的場景中,interface{} 是從收到的訊息中解封的。嘗試在此 interface{} 上執行類型切換(如程式碼片段所示)會產生意外結果,類型會宣告為 map[string]interface{}。

要解決這個問題,了解這一點很重要JSON包解組到的預設類型,如其中所列文件:

  • bool
  • float64
  • 字串
  • []i介面{ }
  • map[string]介面{}
  • nil

自解組是在介面{}中執行的,結果類型將僅限於該集合。因此,該套件不知道像 Something1 和 Something2 這樣的自訂結構。

解決方案選項:

1。直接解組:

為了避免中間介面{}處理,可以將 JSON 資料直接解組為所需的結構類型。例如:

var job Something1
json.Unmarshal([]byte(msg), &job)

2。從通用介面轉換:

如果需要使用通用介面{},可以從map[string]介面{}手動解包資料。這是一個範例:

var input interface{}
json.Unmarshal([]byte(msg), &input)

if smth1, ok := input.(map[string]interface{}); ok {
  job := Something1{
    Thing:        smth1["thing"].(string),
    OtherThing:   smth1["other_thing"].(int64),
  }
}

3.包裝結構:

對於處理各種資料型別很常見的情況,具有自訂UnmarshalJSON 方法的包裝結構可以簡化流程。此方法可以嘗試將資料解組到不同的結構中並相應地設定資料欄位。

以上是如何安全地將 JSON 解組到 Interface{} 並處理類型斷言?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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