亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

在 Golang 中解組具有重疊字段的動態 JSON 數據

在 Golang 中解組具有重疊字段的動態 JSON 數據

Go
守候你守候我 2022-11-28 16:49:40
抱歉,如果我發布的問題已經得到解答,但我似乎無法在這里找到任何類似的情況。我有一個 websocket 客戶端,它接收具有重疊字段的動態 json 數據。字段重疊的事實使解組對我來說非常困難。我有我收到的數據類型的結構,但我需要一種方法來檢查 json 數據,然后再將其解組為特定結構。我希望接口可以充當臨時持有者,然后我可以將接口與我想要解組的特定結構相匹配,但這似乎不可能,或者我只是不知道該怎么做關于它。以下是我正在接收的數據類型的一些示例,以及與它一起使用的結構,以備不時之需。response 1: {"connectionID":17973829270596587247,"event":"systemStatus","status":"online","version":"1.9.0"}response 2: {"channelID":328,"channelName":"ohlc-5","event":"subscriptionStatus","pair":"XBT/USD","status":"subscribed","subscription":{"interval":5,"name":"ohlc"}}response 3: [328,["1649576721.042916","1649577000.000000","42641.50000","42641.50000","42641.50000","42641.50000","42641.50000","0.00335101",2],"ohlc-5","XBT/USD"]response 4: {"event":"heartbeat"}structs belowimport (    "time"    "encoding/json")type ConnStatus struct {    ConnectionID        uint64          `json:"connectionID"`    Event               string          `json:"event"`    Status              string          `json:"status"`    Version             string          `json:"version"`}type HeartBeat struct {    Event               string          `json:"event"`}type OHLCsuccess struct {    ChannelID           int             `json:"channelID"`    ChannelName         string          `json:"channelName"`    Event               string          `json:"event"`    Pair                string          `json:"pair"`    Status              string          `json:"status"`    Subscription        OHLC            `json:"subscription"`}type OHLC struct {    Interval        int         `json:"interval"`    Name            string      `json:"name"`}type OHLCUpdates struct {    ChannelID           int    OHLCArray           OHLCNewTrade    ChannelName         string    Pair                string}關于如何解決這個問題的任何想法?在此先感謝您的幫助!
查看完整描述

1 回答

?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

你能控制不同的反應嗎?如果是這樣,要不要在頂層添加一個“類型”字段?

有關詳細信息,請參閱https://eagain.net/articles/go-dynamic-json/上的“如何將所有內容放在頂層”部分。

例如(未經測試):

func UnmarshalJSON(d []byte) error {

    var jsonValue map[string]interface{}

    err := json.Unmarshal(d, &jsonValue)


    if err != nil {

        return err

    }


    switch jsonValue["type"] {

    case 1:

        // unmarshal into struct type 1

    case 2:

        // unmarshal into struct type 2

    default:

        // throw err

    }


    // or if you don't have access to type:

    if jsonValue["connectionID"] != nil {

        // unmarshal into struct type 1

    }


    return nil

}

或者,您可以嘗試(嚴格)解組到每個結構中,直到您沒有收到錯誤,例如:


func DetermineStruct(d []byte) int {

    var connStatus *ConnStatus


    reader := bytes.NewReader(d)

    decoder := json.NewDecoder(reader)

    decoder.DisallowUnknownFields()


    err := decoder.Decode(connStatus)

    if err == nil {

        panic(err)

    }


    err = json.Unmarshal(d, &connStatus)

    if err == nil {

        return 1

    }


    var ohlcSuccess OHLCsuccess

    err = json.Unmarshal(d, &ohlcSuccess)

    if err == nil {

        return 2

    }

}


查看完整回答
反對 回復 2022-11-28
  • 1 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號