將 JSON 解組到介面{}可以處理多種資料型別。然而,直接斷言已解封的 interface{} 的類型會帶來挑戰。
在給定的場景中,interface{} 是從收到的訊息中解封的。嘗試在此 interface{} 上執行類型切換(如程式碼片段所示)會產生意外結果,類型會宣告為 map[string]interface{}。
要解決這個問題,了解這一點很重要JSON包解組到的預設類型,如其中所列文件:
自解組是在介面{}中執行的,結果類型將僅限於該集合。因此,該套件不知道像 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中文網其他相關文章!