首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Golang中用重叠字段解编组动态JSON数据

在Golang中用重叠字段解编组动态JSON数据
EN

Stack Overflow用户
提问于 2022-04-10 08:29:06
回答 1查看 198关注 0票数 0

很抱歉,如果我张贴的问题已经得到了答案,但我似乎找不到类似的情况在这里。我有一个websocket客户端,它接收带有重叠字段的动态json数据。字段重叠的事实使我很难解算。

我有我接收到的数据类型的结构,但是我需要一种检查json数据的方法,然后才能将它解封为特定的结构。我希望一个接口可以作为一个临时的持有者,然后我就能够将接口与我想要解压缩的特定结构相匹配,但这似乎是不可能的,或者我只是不知道该怎么做。下面是我接收到的数据类型的几个示例,以及结构,以防有帮助。

代码语言:javascript
复制
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 below
import (
    "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
}

type OHLCNewTrade struct {
    StartTime           UnixTime
    EndTime             UnixTime
    Open                float64
    High                float64
    Low                 float64
    Close               float64
    VWAP                float64
    Volume              float64
    Count               int
}

type UnixTime struct {
    time.Time
}

func (u *UnixTime) UnmarshalJSON(d []byte) error {
    var ts int64
    err := json.Unmarshal(d, &ts)
    if err != nil {
        return err
    }
    u.Time = time.Unix(ts, 0).UTC()
    return nil
}

对如何做这件事有什么想法吗?提前感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-10 09:44:18

你能控制不同的反应吗?如果是这样的话,哇,关于添加一个“类型”字段到顶层?

有关更多信息,请参见https://eagain.net/articles/go-dynamic-json/上的“如何将所有内容放在顶层”一节。

例如(未经测试的):

代码语言:javascript
复制
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
}

或者,您可以尝试(严格地)将每个结构解组到每个结构中,直到您没有得到错误为止,例如:

代码语言:javascript
复制
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
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71814937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档