一尘不染

转到websocket序列化/反序列化json

go

我正在使用大猩猩
websocket,并且正在计划使用json进行序列化/反序列化。

假设我有这样的结构来接收传入的消息:

type Foo struct {
    A string `json:"a"`
    B string `json:"b"`
}

type Bar struct {
    C string `json:"c"`
    D string `json:"d"`
}

大猩猩提供conn.ReadJSON接收传入的消息。传入的消息可以是Foo或Bar,但是我不能使用conn.ReadJSON(Foo)和收听其他消息conn.ReadJSON(Bar),这很混乱。我想要conn.ReadJSON(Messages)JSON.parse()javascript
这样的东西。如果接收到Foo,则如何处理传入消息,然后将其存储到Foo结构中;如果接收到Bar,则将其存储到Bar结构中?

我正在解决方案正在使用此结构:

type Messages struct {
    Control string `json:"control"`
    X // Data type for either Foo or Bar struct
}

现在,传入消息具有json控件,控件的值可以是Foo或Bar。使用if elseif control ==
Foo然后X将其分配给Foo,否则X将其分配给Bar。但是我不知道的数据类型X

任何解决方案都欢迎,谢谢。


阅读 816

收藏
2020-07-02

共1个答案

一尘不染

使用RawMessage

type Messages struct {
  Control string `json:"control"`
  X json.RawMessage
}

var m Messages
err := c.ReadJSON(&m)
if err != nil {
    // handle error
}
switch m.Control {
case "Foo":
    var foo Foo
    if err := json.Unmarshal([]byte(m.X), &foo); err != nil {
       // handle error
    }
    // do something with foo

case "Bar":
   ... follow pattern for Foo

}
2020-07-02