1 回答
TA贡献1780条经验 获得超5个赞
1. 因为它看到一个 JSON 对象,并且如文档所述,map[string]interface{}当存储到一个 JSON 对象时变成一个interface{}(这是一般情况下可以保存 JSON 对象中任何内容的唯一类型)。
2. 鉴于您目前的情况,您可以将地图的每个字段分配给新的Data1或的适当字段Data2。
3. 处理这个问题的理想方法是使用json.RawMessage延迟解码Data直到你知道它是什么。这可以这样处理:
type Msg struct {
MsgType int
Data interface{}
}
func (m *Msg) UnmarshalJSON(b []byte) (err error) {
var tmp struct {
MsgType int
Data json.RawMessage
}
err = json.Unmarshal(b, &tmp)
if err != nil {
return
}
m.MsgType = tmp.MsgType
switch (tmp.MsgType) {
case 1:
data := Data1{}
err = json.Unmarshal(tmp.Data, &data)
if err != nil {
return
}
m.Data = data
case 2:
data := Data2{}
err = json.Unmarshal(tmp.Data, &data)
if err != nil {
return
}
m.Data = data
default:
return errors.New("invalid DataType")
}
return
}
然后你可以调用json.Unmarshalorjson.Decode直接在 a 上*Msg,它Data会根据你的需要进行解码。
- 1 回答
- 0 关注
- 118 浏览
添加回答
举报