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

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

將通用 JSON 對(duì)象解碼為多種格式之一

將通用 JSON 對(duì)象解碼為多種格式之一

幕布斯7119047 2021-09-13 09:43:54
我正在研究 Go 中基于 JSON 的通用消息傳遞協(xié)議。我想要做的是BaseMessage具有一般信息,例如Type,timestamp等。但同時(shí)我希望能夠?yàn)槟承╊?lèi)型的數(shù)據(jù)定義更具體的消息結(jié)構(gòu)。例如:type Message struct {    Type      string `json:type`    Timestamp string `json:timestamp`}type EventMessage struct {    Message    EventType string    EventCreator string    EventData interface{}}我有一組處理程序,為了確定哪個(gè)處理程序應(yīng)該處理消息,我首先將 JSON 解碼為通用Message類(lèi)型以檢查該Type字段。對(duì)于此示例,我將獲取與“事件”消息類(lèi)型關(guān)聯(lián)的處理程序。當(dāng)我想將EventMessage類(lèi)型斷言到結(jié)構(gòu)上時(shí),我遇到了問(wèn)題。以下代碼非常粗略,但希望它顯示了我嘗試處理消息的總體思路。type Handler func(msg Message) Messagehandlers := make(map[string]Handler)var msg Messagedecoder.Decode(&msg)handler := handlers[msg.Type]handler(msg)我曾嘗試使用一個(gè),interface{}但 JSON 解碼器只是創(chuàng)建了一個(gè)地圖,然后我無(wú)法斷言任何一種類(lèi)型。我已經(jīng)找到了使其成為可能的解決方法,但它非常丑陋,可能效率不高,而且很可能容易出錯(cuò)。我想讓事情簡(jiǎn)單明了,以便可以輕松維護(hù)此代碼。是否有一種在 Go 中處理通用 JSON 對(duì)象的方法,以便解碼后的 JSON 可以是許多結(jié)構(gòu)格式之一?我也想過(guò)在Data interface{}主Message結(jié)構(gòu)中的 a中包含更具體的信息,但后來(lái)我遇到了無(wú)法在接口上斷言任何類(lèi)型的相同問(wèn)題。必須有更好的方法來(lái)處理我剛剛?cè)鄙俚?JSON 格式。
查看完整描述

1 回答

?
慕勒3428872

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊

處理此問(wèn)題的一種方法是使用json.RawMessage字段為消息的固定部分定義一個(gè)結(jié)構(gòu),以捕獲消息的變體部分。將 json.RawMessage 解碼為特定于變體的類(lèi)型:


type Message struct {

  Type      string `json:"type"`

  Timestamp string `json:"timestamp"`

  Data      json.RawMessage

}  


type Event struct {

   Type    string `json:"type"`

   Creator string `json:"creator"`

}



var m Message

if err := json.Unmarshal(data, &m); err != nil {

    log.Fatal(err)

}

switch m.Type {

case "event":

    var e Event

    if err := json.Unmarshal([]byte(m.Data), &e); err != nil {

        log.Fatal(err)

    }

    fmt.Println(m.Type, e.Type, e.Creator)

default:

    log.Fatal("bad message type")

}


查看完整回答
反對(duì) 回復(fù) 2021-09-13
  • 1 回答
  • 0 關(guān)注
  • 185 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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