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

如何使用 Gorilla Websocket 处理 Go WebSocket 中的混合 JSON 消息类型?

Mary-Kate Olsen
发布: 2024-11-14 19:40:03
原创
375 人浏览过

How to Handle Mixed JSON Message Types in Go WebSocket using Gorilla Websocket?

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

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