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 關注
- 151 瀏覽
添加回答
舉報