将 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中文网其他相关文章!