第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

為什么要去 json.Unmarshal auto convert interface{}

為什么要去 json.Unmarshal auto convert interface{}

Go
牧羊人nacy 2023-06-12 15:26:37
程序會收到很多 msg,msg 有不同的結(jié)構(gòu)“Data”,所以我定義了 Msg 結(jié)構(gòu):type Msg struct {    MsgType int    Data interface{}}type Data1 struct {//msg type 1 Data struct}type Data2 struct {//msg type 2 Data struct}func (msgStr string) {    msg := Msg{}    if err := json.Unmarshal([]byte(msgStr), &msg); err != nil {        //log err    }    switch msg.MsgType{    case 1:        //convert msg.Data to a type 1 struct    case 2:        //convert msg.Data to a type 2 struct    }}但是打印出 msg.Data,它是一個(gè)映射,而不是 interface{},所以當(dāng)我通過 msg.Data.(Data1) 將它轉(zhuǎn)換為 Data1 時(shí),出現(xiàn)錯(cuò)誤。那么,1. 為什么 interface{} 自動(dòng)轉(zhuǎn)換為 map?2.如何轉(zhuǎn)換成我想要的Data1結(jié)構(gòu)?3.這個(gè)場景的最佳實(shí)踐是什么。
查看完整描述

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)行解碼。


查看完整回答
反對 回復(fù) 2023-06-12
  • 1 回答
  • 0 關(guān)注
  • 156 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號