Go 中 Websocket 的通用 JSON 序列化/反序列化
使用 Websocket 时,经常需要序列化和反序列化 JSON 数据以进行通信客户端和服务器之间。一个常见的挑战是处理不同类型的传入消息,例如具有不同字段的结构。
在这种情况下,使用 gorilla websocket 和 JSON 进行序列化和反序列化,显式指定每条消息的类型可能很麻烦。 conn.ReadJSON() 函数需要提供特定类型,这在处理多种消息类型时并不总是实用。
使用 JSON 控件的通用解决方案
通用解决方案涉及定义一个包含指示消息类型的控制字段的结构。此控制字段允许程序确定用于反序列化的特定数据结构。
type Messages struct { Control string `json:"control"` X json.RawMessage }
此 Messages 结构包括一个 Control 字段和一个 X 字段,它可以将任何类型的 JSON 数据作为原始消息保存.
反序列化和处理消息
使用 conn.ReadJSON() 接收消息时,数据可以存储在 Messages 结构中。然后,Control 字段可用于确定 X 字段中存储的数据的实际类型。
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 the same pattern for the Bar struct }
在此示例中,如果 Control 字段为“Foo”,则 X 字段将反序列化为 Foo使用 json.Unmarshal() 构造。对于其他消息类型,可以重复此过程。
此方法的优点:
以上是如何在 Go Websockets 中处理多种消息类型的 JSON 序列化/反序列化?的详细内容。更多信息请关注PHP中文网其他相关文章!