WebSocket传输JSON需手动序列化与反序列化:前端用JSON.stringify()并try...catch容错,后端用JSON.parse()并做类型校验;协议应统一消息结构,跨语言注意字段名映射。

WebSocket 本身不理解 JSON,它只负责传输原始字节。要传对象,必须手动序列化;收到字符串后,也必须手动反序列化——这是最核心、不可绕过的逻辑。
前端发送:必须 JSON.stringify(),且做好容错
原生 socket.send() 只接受字符串、ArrayBuffer、Blob 或 TypedArray。直接传 JS 对象(如 {type: "login", user: "Alice"})不会报错,但实际发送的是 "[object Object]",服务端解析必然失败。
- ✅ 正确做法:用
JSON.stringify()转成字符串再发 - ⚠️ 必须包裹
try...catch,防止因undefined、Date、函数、循环引用等导致序列化失败或静默丢包 - ? 建议统一时间字段格式,比如把
new Date()改为Date.now()或toISOString(),避免后端解析歧义 - ? 对金额、ID 等敏感数值,推荐转成字符串传输(如
{"price": "199.99"}),规避浮点精度问题
后端接收:必须手动 JSON.parse(),且做防御性校验
无论 Java、Python、Go 还是 Node.js,WebSocket 接口返回的永远是原始字符串(或字节流),不是解析好的对象。跳过反序列化,就等于没收到有效数据。
- ✅ 收到消息后第一件事:确认
event.data是字符串类型,再调用JSON.parse() - ⚠️ 必须
try...catch捕获SyntaxError,非法 JSON 不能静默忽略 - ? 解析成功后,还需检查关键字段是否存在、类型是否匹配(例如
typeof data.id === 'string'),建议用轻量 schema 库(如 Zod、Yup、Jackson JsonNode)做结构验证 - ? 若协议要求,可在顶层加
signature、nonce、timestamp字段,用于防重放和验签
协议设计:加一层轻量结构,提升健壮性
纯裸 JSON 容易混乱,实际项目中推荐约定统一消息格式,便于路由、日志、调试和扩展。
- ? 顶层固定字段:
{"type": "user_update", "payload": {...}, "id": "req_abc123", "ts": 1719104460000} - ? 大消息分块:超过 64KB 时,拆成多帧,带
chunk_id和total_chunks,由客户端拼接 - ? 错误响应标准化:
{"code": "INVALID_TOKEN", "message": "Token expired", "details": {...}},前端可统一处理提示 - ? 编码严格使用 UTF-8,不加 BOM;服务端无需声明 charset,WebSocket 协议已规定编码
跨语言注意事项:字段名与类型对齐
不同语言对 JSON 的映射规则不同,稍不注意就会“发得出去,收不回来”。
- ? Go 结构体需加
json:"field_name"tag,且注意大小写(小写字段默认不导出) - ⚙️ Java 使用 Jackson 时,确保
@JsonProperty("user_id")与前端 key 一致,或配置全局驼峰转下划线 - ? Python FastAPI/Pydantic 模型字段名必须与 JSON key 完全匹配,否则默认填零值或报错
- ?️ 二进制内容(如图片)应 Base64 编码后作为字符串字段嵌入,不要试图把整个 JSON 当二进制发











