map无法直接json序列化,因其键可为任意类型且内部结构不被json支持;需先转为二维数组再序列化,反序列化时用new map()还原。

Map 不能直接用 JSON.stringify() 序列化,调用后会得到空对象 {};也不能用 JSON.parse() 直接还原。必须手动转成 JSON 兼容格式再处理。
为什么 Map 无法直接 JSON 序列化
JSON 规范只支持字符串、数字、布尔值、null、数组和普通对象这几种基础类型。Map 是内置构造函数创建的特殊对象,内部使用迭代器管理键值对,且允许任意类型作 key(比如对象、函数、Symbol),这些都不在 JSON 能表示的范围内。所以:
-
JSON.stringify(new Map([['a', 1]]))返回"{}" - key 是
{id: 1}或undefined时,根本无法被 JSON 表示 - 即使序列化成功,反序列化后也无法恢复原始 key 的引用或类型(如 Date、RegExp)
序列化:Map → JSON 字符串
核心思路是先把 Map 转成二维数组 [[key, value], [key, value], ...],这种结构能被 JSON.stringify() 正确处理。
- 用
Array.from(map)或[...map]获取键值对数组 - 确保 key 和 value 都是 JSON-safe 类型(字符串、数字、布尔、null、普通对象、数组)
- 避免用函数、Symbol、undefined、Date 实例等作 key,否则会被忽略或出错
示例代码:
return JSON.stringify(Array.from(map));
}
输入 new Map([['name', 'Alice'], [42, 'answer']]),输出:[["name","Alice"],[42,"answer"]]
反序列化:JSON 字符串 → Map
先用 JSON.parse() 得到二维数组,再传给 new Map() 构造函数即可还原。
- 必须保证解析结果是数组,且每个子项是长度为 2 的数组(即
[key, value]) - 如果原始 key 是 Date、RegExp 等对象,JSON 里只能存字符串,需额外逻辑还原(例如约定字段名 + 类型标记)
- 对象作 key 时,反序列化后是新对象,不等于原 key(Map 的键匹配基于严格相等,引用不同就查不到)
示例代码:
function jsonToMap(jsonStr) {const arr = JSON.parse(jsonStr);
return new Map(arr);
}
注意事项与常见坑
实际使用中容易忽略几个关键点:
- 嵌套 Map 或含复杂值(如另一个 Map、Set、自定义类实例)时,需递归处理,不能只靠一层转换
- key 为布尔值或数字时,JSON 会正确保留,但要注意反序列化后仍是原始值,不是字符串
- 服务端接收 JSON 后重建 Map,需确认运行环境支持
new Map()(现代浏览器和 Node.js ≥ 0.12 都支持) - 若需长期存储或跨语言交互,建议统一用 plain object 替代 Map,避免兼容性问题











