map 不能被 json.stringify() 直接序列化,因其键可为任意类型而 json 仅支持字符串键;默认序列化结果为{},需转为二维数组(array.from(map.entries()))或字符串键对象(object.fromentries())实现可靠转换。

Map 不能被 JSON.stringify() 直接序列化,这是 JavaScript 的固有限制——不是 bug,而是设计使然。根本原因在于 JSON 格式只支持字符串作为键,而 Map 允许任意类型(对象、函数、Symbol 等)作键;同时,JSON.stringify() 对非普通对象(如 Map、Set)默认返回空对象 {},数据完全丢失。
一眼识别不兼容的典型表现
遇到以下任一情况,基本可判定是 Map 与 JSON 序列化不匹配:
-
输出为空对象:执行
JSON.stringify(new Map([['a', 1]]))得到"{}",而非预期的键值内容 -
嵌套后数据消失:将 Map 放入普通对象再序列化,例如
JSON.stringify({ config: new Map([['mode', 'dark']]) }),结果中config字段为{} -
还原失败或类型错乱:用
JSON.parse()得到的仍是普通对象或数组,无法直接转回 Map 实例,需额外构造逻辑
可靠的手动转换方案(推荐二维数组格式)
最通用、无歧义的方式是把 Map 转为「键值对数组」,即 [[k1,v1], [k2,v2]] 形式,它能保留原始键的值(只要键本身可被 JSON 序列化):
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
Map → JSON 字符串:
JSON.stringify(Array.from(map.entries())) -
JSON 字符串 → Map:
new Map(JSON.parse(jsonStr))
注意:若 Map 中含有 undefined、函数、Symbol 等不可序列化键,JSON.stringify() 会静默忽略该键值对或报错,建议提前校验或过滤。
当键确定为字符串时,可用 Object 格式提升可读性
如果业务明确 Map 所有键都是字符串(如配置映射),可转为 plain object,生成标准 JSON 对象字符串:
- 转换方法:
JSON.stringify(Object.fromEntries(map)) - 优势:结果形如
{"theme":"light","lang":"zh"},前端调试、后端接收更直观 - 限制:一旦键不是字符串(比如
map.set(42, 'answer')),Object.fromEntries()仍能运行但键会被强制转为字符串"42",语义可能变化
复杂场景:含循环引用或嵌套 Map/Set 的对象
若整个对象结构包含 Map、Set 且存在循环引用(如图节点互相引用),仅靠 Array.from() 不够。此时需主动干预序列化流程:
- 在自定义类中实现
toJSON()方法,返回纯数据结构(例如把this.nodesMap 显式转为数组) - 使用
JSON.stringify(obj, (key, value) => { ... })的 replacer 参数,对 Map/Set 类型单独处理 - 对循环引用,配合
WeakSet记录已遍历对象,遇到重复引用时返回占位符(如"[Circular]")










