Map无法被JSON.stringify()直接序列化,会返回{};推荐转为二维数组再序列化以保留键类型,反序列化时用new Map()还原;自定义replacer可支持嵌套场景,但需配套解析逻辑。

JavaScript 的 Map 对象默认不能被 JSON.stringify() 直接序列化,调用后会得到一个空对象 {}。这是因为 JSON.stringify() 只处理可枚举的自有属性,而 Map 的键值对是通过内部机制存储的,不作为对象属性暴露。
将 Map 转为普通对象再序列化
最常用、兼容性最好的方式是先将 Map 转成一个能被 JSON 正确识别的普通对象(如数组或键值对对象),再调用 JSON.stringify()。
- 推荐转为二维数组(
Array<[key, value]>):保留原始键类型信息(包括对象、函数等),反序列化时也容易还原 - 若键全是字符串,也可转为纯对象(
{ key: value }),但会丢失非字符串键(如Symbol、对象、数字作为键时会被强制转为字符串,可能造成冲突)
示例:
const map = new Map([['name', 'Alice'], [42, 'answer'], [{id: 1}, 'obj-key']]);
const arr = Array.from(map); // [['name', 'Alice'], [42, 'answer'], [{id: 1}, 'obj-key']]
const json = JSON.stringify(arr); // '[["name","Alice"],[42,"answer"],[{"id":1},"obj-key"]]'
反序列化时还原为 Map
存储后的 JSON 字符串需手动解析并重建 Map 实例:
立即学习“Java免费学习笔记(深入)”;
const parsed = JSON.parse(json); const restoredMap = new Map(parsed); // 自动识别每项为 [key, value] 数组
注意:如果原始 Map 的键是函数、undefined、NaN 或循环引用,JSON 本身不支持,此时无法无损保存 —— 这是 JSON 格式的限制,不是 Map 的问题。
自定义序列化器(使用 replacer 参数)
若想在 JSON.stringify() 中直接处理 Map,可传入自定义 replacer 函数:
function mapReplacer(key, value) {
if (value instanceof Map) {
return {
__type__: 'Map',
value: Array.from(value)
};
}
return value;
}
const data = { config: new Map([['timeout', 5000]]), version: 2 };
const json = JSON.stringify(data, mapReplacer);
// {"config":{"__type__":"Map","value":[["timeout",5000]]},"version":2}
这种方式适合嵌套结构中混用 Map 和其他数据,但需配套写反序列化解析逻辑(检查 __type__ === 'Map' 并重建)。
注意事项与替代方案
-
Map键为NaN是合法的(map.set(NaN, 'x')),但 JSON 中NaN会被转为null,无法还原 - 若只需存字符串键/值,且不要求严格还原,可用
Object.fromEntries(map)→JSON.stringify(),更简洁 - 需要完整类型保真(如
Set、Map、Date、RegExp),建议用 structuredClone(现代环境)或第三方库如flatted、serialize-javascript


















