我在一个模块中有以下结构:type Event struct { Name string `json:"name"` Version string `json:"version"` Payload interface{} `json:"payload"`}目标是,我可以接受任意结构,并使用一些消息传递服务将类型的最终结构作为json序列化字符串发送。PayloadEventjson.Marshal但是,当我尝试在另一个项目中时,我无法访问 中的字段,因为 Go 显然不知道其最终类型。json.UnmarshalEvent.Payload我试图使用这样的东西:type EventPayload struct{ Name string `json:"name"`}// ...event := &events.Event{}event.Payload = &EventPayload{}if err := json.Unmarshal(msg.Data, event); err != nil { return err}event.Payload.Name // Won't work: "type interface{} has no field or method Status"然而,Go仍然认为,那是一个.event.Payloadinterface{}在这种情况下,我如何判断Go正确的结构类型?
2 回答
一只甜甜圈
TA贡献1836条经验 获得超5个赞
您可以完全按照您描述的方式执行操作,只需使用类型断言来恢复基础类型即可。,前提是字段预填充了具体类型,则将使用该具体类型。json.Unmarshalinterface{}
event := &Event{}
event.Payload = &EventPayload{}
msg := []byte(`{"Name": "foo", "Version": "1", "Payload": {"Name": "bar"}}`)
if err := json.Unmarshal(msg, event); err != nil {
panic(err)
}
pl := event.Payload.(*EventPayload)
fmt.Println(pl.Name)
工作示例(稍作修改,可在操场上运行):https://play.golang.org/p/IDXLKeMGw8_1
FFIVE
TA贡献1797条经验 获得超6个赞
在这种情况下,我如何判断Go正确的结构类型?
你不能。这不是编码/json的方式。Unmarshal作品。您要么必须将marshal取消到适当的类型或其他类型中,要么使用json。原始消息并做第二次取消marshaling或其他什么,但他们的方式你接近它根本不起作用。
- 2 回答
- 0 关注
- 159 浏览
添加回答
举报
0/150
提交
取消
