Go websocket 序列化/反序列化 json
Posted
技术标签:
【中文标题】Go websocket 序列化/反序列化 json【英文标题】:Go websocket serialization/deserialization json 【发布时间】:2016-12-13 00:32:41 【问题描述】:我正在使用gorilla websocket,我正在计划使用 json 进行序列化/反序列化。
假设我有这样的结构来接收传入的消息:
type Foo struct
A string `json:"a"`
B string `json:"b"`
和
type Bar struct
C string `json:"c"`
D string `json:"d"`
gorilla 提供conn.ReadJSON
用于接收传入的消息。传入的消息可以是 Foo 或 Bar,但我不能使用 conn.ReadJSON(Foo)
并收听其他 conn.ReadJSON(Bar)
,这是一团糟。我想要像 conn.ReadJSON(Messages)
这样的东西,比如 javascript 中的 JSON.parse()
。如果收到Foo,如何处理传入的消息,然后将其存储到Foo
struct,如果收到Bar,则将其存储到Bar
struct 中?
我认为解决方案是使用这个结构:
type Messages struct
Control string `json:"control"`
X // Data type for either Foo or Bar struct
传入的消息现在有 json 控件,控件的值可以是 Foo 或 Bar。使用if else
if control==Foo 然后X
分配给Foo,否则X
分配给Bar。但我不知道X
的数据类型。
欢迎任何解决方案,谢谢。
【问题讨论】:
【参考方案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
【讨论】:
感谢您的快速回答,这对我很有帮助。解决方案在encoding/json
中,我意识到在询问之前我需要阅读更多内容,再次感谢您。以上是关于Go websocket 序列化/反序列化 json的主要内容,如果未能解决你的问题,请参考以下文章