將JSON 解組到Go 中的介面
考慮這樣的場景,您有一個JSON 字串,它具有取決於特定欄位的不同資料結構,例如作為“cmd”欄位。您希望將此 JSON 解組到包含一個具有 interface{} 類型的欄位的 Go 結構體中,並根據「cmd」值使其適應不同的資料結構。
解決方案
要實現此目的,請定義一個具有固定字段的基本結構和一個 json.RawMessage 字段來保存變體資料。然後,為每個變體建立特定的結構類型,並根據命令解組它們。
例如:
type Message struct { Cmd string `json:"cmd"` Data json.RawMessage } type CreateMessage struct { Conf map[string]int `json:"conf"` Info map[string]int `json:"info"` } func main() { var m Message if err := json.Unmarshal(data, &m); err != nil { log.Fatal(err) } switch m.Cmd { case "create": var cm CreateMessage if err := json.Unmarshal([]byte(m.Data), &cm); err != nil { log.Fatal(err) } fmt.Println(m.Cmd, cm.Conf, cm.Info) default: log.Fatal("bad command") } }
在此範例中,Message 結構代表整體訊息結構,包含「cmd」欄位和 json.RawMessage 欄位用於保存變體資料。 CreateMessage 是表示「建立」指令變體的特定結構類型。
程式碼將初始 JSON 字串解組為 Message 變量,然後使用「cmd」欄位確定要解組和列印的特定變體。
以上是如何根據動態欄位值將 JSON 解組到 Go 介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!