WebSocket传输需前后端协同设计数据格式与校验:前端须用JSON.stringify()序列化并处理日期、精度等问题;后端必须反序列化且校验字段;高吞吐场景可选二进制协议优化性能。

WebSocket 本身不理解结构化数据,它只负责传输原始字节或字符串。高效处理的关键不在“连上就行”,而在于前后端对数据格式、序列化策略和运行时校验的协同设计。
前端发送:必须序列化,还要避开陷阱
WebSocket 的 send() 方法不接受对象,直接传入会变成 "[object Object]"。必须用 JSON.stringify() 转为字符串。
- 日期、
undefined、循环引用字段会导致JSON.stringify()返回undefined或报错,建议用replacer过滤:例如JSON.stringify(obj, (k, v) => v instanceof Date ? v.toISOString() : v) - 金额、高精度浮点数等敏感字段,别传
number,改用字符串:{"price": "99.99"},避免 JS 数值精度丢失和后端类型不匹配 - 消息体建议统一顶层结构,比如
{"type": "trade", "payload": {...}, "seq": 123},便于路由分发和调试
后端接收:不能跳过反序列化
无论用 Go、Python、Java 还是 Node.js,WebSocket 接口(如 receive_text()、ReadMessage())返回的永远是原始字节或字符串,不是解析好的对象。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- Go 示例:
json.Unmarshal(dataBytes, &msg)—— 忘了这步,msg就是零值 - FastAPI 示例:
data = await websocket.receive_text(); msg = json.loads(data)——json.loads()不可省略 - 字段名大小写、下划线风格不一致时,反序列化可能静默失败;务必检查结构体 tag(Go)或 Pydantic model 字段定义是否与 JSON key 完全对应
数据可用性:光能解析不等于可用
成功 JSON.parse() 或 json.Unmarshal() 只代表语法合法,不代表业务数据完整可靠。
- 检查关键字段是否存在且类型正确,例如:
typeof data.payload === 'object' && typeof data.payload.user_id === 'string' - 推荐轻量级 schema 校验:前端用 Zod(
z.object({...}).safeParse()),后端 Go 用go-playground/validator,Python 用 Pydantic - 嵌套深、字段多时,额外字段或缺失字段都可能引发后续 panic 或逻辑错误,需在入口做结构收敛
进阶优化:二进制替代 JSON
当吞吐量或延迟敏感(如金融行情、高频 K 线),纯文本 JSON 成为瓶颈。可改用二进制协议提升效率:
- 用
Uint16Array或Uint32Array打包数值型字段,体积减少约 67%,序列化/反序列化耗时降低 60% 以上 - Protobuf 是成熟选择,尤其适合抖音直播这类自定义二进制协议场景,体积小、解析快、强类型
- 注意:二进制内容(如 base64 图片)仍应包裹在字符串字段里,不要把整个 JSON 当二进制传,避免协议混淆

















