在 Go 中将 JSON Websocket 消息反序列化为联合类型
在 Go 中,gorilla websocket 库通常用于处理 websocket 连接。但是,当使用 JSON 进行序列化和反序列化时,处理不同类型的传入消息会带来挑战。
考虑以下示例,其中您有消息类型“Foo”和“Bar”的结构:
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 函数允许您将传入的 JSON 消息反序列化为特定的结构。但是,您需要使用单独的 conn.ReadJSON(Foo) 和 conn.ReadJSON(Bar) 调用来处理不同类型的消息,这是低效且麻烦的。
为了解决这个问题,您可以使用中介包含控制字段和保存实际消息数据的字段的结构体:
type Messages struct { Control string `json:"control"` X json.RawMessage }
Control 字段指示有效负载的类型,X 保存原始 JSON 数据。要使用此方法反序列化传入消息:
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 handling Bar }
此解决方案允许您使用 json.RawMessage 中的 RawMessage 接口类型来反序列化传入消息,无论其类型如何。 switch 语句检查控制字段以确定实际的消息类型并相应地反序列化。
以上是如何在 Go 中将 JSON Websocket 消息反序列化为联合类型?的详细内容。更多信息请关注PHP中文网其他相关文章!