Go WebSocket JSON 序列化/反序列化:处理混合传入消息
在 Go 中,使用 gorilla websocket 包进行 WebSocket 通信,处理传入消息混合类型可能会带来挑战。该库的 conn.ReadJSON 函数仅限于反序列化为单个结构类型。
问题陈述
考虑两个结构,Foo 和 Bar,代表传入消息类型:
type Foo struct { A string `json:"a"` B string `json:"b"` } type Bar struct { C string `json:"c"` D string `json:"d"` }
要求是处理这些传入消息,识别它们的类型(Foo 或 Bar)并相应地将它们反序列化为适当的结构。
解决方案
要处理混合传入消息,可以采用以下方法:
1.使用包装结构:
创建一个包装结构 Messages,其中包含一个用于指定消息类型的 Control 字段和一个用于保存反序列化数据的 X 字段。
type Messages struct { Control string `json:"control"` X json.RawMessage }
2.将 JSON 读取到 Wrapper 结构中:
使用 conn.ReadJSON 将传入消息反序列化到 Messages 结构中。
var m Messages err := c.ReadJSON(&m) if err != nil { // handle error }
3.解析消息类型:
根据m.Control的值判断实际的消息类型(Foo或Bar)。
switch m.Control { case "Foo": // Convert the JSON to a Foo struct case "Bar": // Convert the JSON to a Bar struct }
示例代码:
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 }
通过在Messages结构体中使用json.RawMessage,可以根据消息类型动态处理反序列化的数据。该解决方案允许灵活处理具有不同结构的传入消息。
以上是如何使用 Gorilla Websocket 处理 Go WebSocket 中的混合 JSON 消息类型?的详细内容。更多信息请关注PHP中文网其他相关文章!