將JSON 編組到Go 中的介面
處理複雜的資料結構時,通常需要將JSON 編組到介面{}實現靈活性和多態性。本文針對您想要將 JSON 編組到介面{}並根據欄位值動態將其轉換為特定類型的特定場景提供了解決方案。
問題描述
考慮以下情況:您有一個 Message 類型,其中包含一個名為 Data 的 interface{} 欄位。您還有一個 CreateMessage 類型,它表示資料欄位的特定變體。在解組包含命令(在本例中為「create」)和與 CreateMessage 類型相符的資料的 JSON 字串時,您會遇到資料保留為介面的問題{}。
解決方案
要解決此問題,您需要利用 Go 的類型系統和 JSON 的靈活性。定義一個新的結構體類型Message,它嵌入原來的Message類型並新增一個名為Data的RawMessage欄位。 RawMessage 是encoding/json 套件提供的一種特殊類型,它允許您儲存任意 JSON 資料而不會遺失類型資訊。
type Message struct { Cmd string Data json.RawMessage }
接下來,為Data 欄位的每個變體定義一個結構類型,在此案例,CreateMessage:
type CreateMessage struct { Conf map[string]int Info map[string]int }
現在,在您的解組程式碼中,您可以開啟Cmd 欄位的值並將資料解碼為適當的具體內容type:
switch m.Cmd { case "create": var cm CreateMessage if err := json.Unmarshal(m.Data, &cm); err != nil { log.Fatal(err) } fmt.Println(m.Cmd, cm.Conf, cm.Info) default: log.Fatal("bad command") }
此方法可讓您將JSON解組為介面{},同時保留稍後根據已知值將其轉換為特定類型的能力。
以上是如何將 JSON 編組到 Go 介面{}並將其動態轉換為特定型別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!