我是Go的新手,现在我遇到了问题.我有一个名为Message的类型,它是这样的结构:
type Message struct {
Cmd string `json:"cmd"`
Data interface{} `json:"data"`
}
Run Code Online (Sandbox Code Playgroud)
我也有一个名为CreateMessage的类型,如下所示:
type CreateMessage struct {
Conf map[string]int `json:"conf"`
Info map[string]int `json:"info"`
}
Run Code Online (Sandbox Code Playgroud)
我有一个像JSON字符串{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}}.
当我用json.Unmarshal它将其解码为Message变量时,答案是{Cmd:create Data:map[conf:map[a:1] info:map[b:2]]}.
那么我可以将JSON解码为Message结构并根据Cmd更改其Data的接口{}以键入CreateMessage吗?
我试图将Data直接转换为CreateMessage类型,但编译器告诉我Data是map [sting] interface {}类型.
Cer*_*món 34
使用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")
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19855 次 |
| 最近记录: |