1 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊
1. 因?yàn)樗吹揭粋€(gè) JSON 對象,并且如文檔所述,map[string]interface{}當(dāng)存儲到一個(gè) JSON 對象時(shí)變成一個(gè)interface{}(這是一般情況下可以保存 JSON 對象中任何內(nèi)容的唯一類型)。
2. 鑒于您目前的情況,您可以將地圖的每個(gè)字段分配給新的Data1或的適當(dāng)字段Data2。
3. 處理這個(gè)問題的理想方法是使用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
}
然后你可以調(diào)用json.Unmarshalorjson.Decode直接在 a 上*Msg,它Data會根據(jù)你的需要進(jìn)行解碼。
- 1 回答
- 0 關(guān)注
- 156 瀏覽
添加回答
舉報(bào)