我正在使用大猩猩 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结构中?
conn.ReadJSON
conn.ReadJSON(Foo)
conn.ReadJSON(Bar)
conn.ReadJSON(Messages)
JSON.parse()
Foo
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。
if else
X
任何解决方案都欢迎,谢谢。
使用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 }