必须手动序列化和反序列化,WebSocket协议本身不解析JSON;直接传对象会发送"[object Object]",服务端无法获取结构化数据;需用JSON.stringify()发送并加try-catch防undefined、循环引用等导致静默失败,后端须显式json.Unmarshal或配置Decoder.Text解析。

必须手动序列化和反序列化,WebSocket协议本身不认JSON。直接传对象会发过去"[object Object]",服务端收不到结构化数据;不加错误捕获,undefined、循环引用、Date实例等会让send()静默失败。
前端发送:JSON.stringify() 是唯一安全路径
原生WebSocket.send()只接受string、ArrayBuffer、Blob或TypedArray。JS对象不是合法类型,也不会自动转换。
- ✅ 正确写法:
socket.send(JSON.stringify({ type: "ping", ts: Date.now() })) - ❌ 错误写法:
socket.send({ type: "ping" })→ 服务端收到"[object Object]" - ⚠️ 高危字段:
new Date()、function、undefined、Infinity会触发TypeError,必须提前过滤或替换 - ? 建议包裹
try...catch,避免因序列化失败导致消息丢失无提示
后端接收:不能依赖“自动解析”,得自己json.Unmarshal或配Decoder.Text
无论用 Go(gorilla/websocket)、Java(javax.websocket)还是 Python(FastAPI),默认都不拆包JSON——你收到的永远是原始字符串。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- Go 示例:
err := json.Unmarshal(message, &req); if err != nil { /* 处理解析失败 */ } - Spring Boot:
@OnMessage参数若为String,需手动new ObjectMapper().readValue(data, Xxx.class);若想直接收User对象,必须在@ServerEndpoint(decoders = {UserDecoder.class})里声明解码器,且willDecode()返回true - FastAPI:
await websocket.receive_json()是封装好的快捷方式,底层仍是json.loads(),但会自动抛出WebSocketDisconnect或JSONDecodeError
跨语言兼容性:别信“智能识别”,统一约定格式再校验
没有标准规定 WebSocket 消息体必须是 JSON,也没有中间件会主动 sniff 内容类型。前后端必须事先约定字段名、必选/可选、空值处理逻辑。
- 字段缺失时,前端
msg.user?.name比msg.user.name更健壮 - 后端建议对关键字段做存在性检查,比如
if req.Type == "" { return errors.New("missing 'type'") } - 时间戳统一用
number(毫秒级Date.now()),不用string格式日期,避免解析歧义 - 不要在 JSON 里传二进制数据(如图片 base64),体积大、易出错;改用
ArrayBuffer单独发
最容易被忽略的是错误边界:前端没try-catch,后端没json.Unmarshal错误处理,一遇到非法值就静默断连或丢包。真实线上环境里,这类问题往往拖到用户反馈才暴露。

















