首页 > 后端开发 > Golang > 正文

如何在 Go 中将 JSON Websocket 消息反序列化为联合类型?

Linda Hamilton
发布: 2024-11-20 11:18:02
原创
520 人浏览过

How to Deserialize JSON Websocket Messages as Union Types in Go?

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板