map 不能被 json.stringify() 直接序列化,需先转为数组(如[...map])或对象(如object.fromentries(map));推荐用数组格式以保留键类型并支持往返还原。

JavaScript 中的 Map 对象不能被 JSON.stringify() 直接序列化,因为它的键值对不是标准的可枚举属性,且 Map 不是普通对象。要转成 JSON 字符串,需先将其转换为兼容 JSON 的结构(如数组或普通对象)。
方法一:转成键值对数组再序列化
这是最常用、语义清晰的方式。将 Map 转为二维数组 [[key, value], ...],JSON 可原生支持数组和基本类型:
- 使用
Array.from(map)或展开运算符[...map] - 再用
JSON.stringify()序列化
示例:
const map = new Map([['name', 'Alice'], ['age', 30], [true, 'yes']]); const jsonStr = JSON.stringify([...map]); // 结果: [["name","Alice"],["age",30],[true,"yes"]]
方法二:转成普通对象(适合字符串键)
如果 Map 的所有键都是字符串(或能安全转为字符串),可构造一个普通对象,便于后续解析和阅读:
- 遍历
Map,用Object.fromEntries(map)(ES2019+)最简洁 - 若需兼容旧环境,可用
Object.assign({}, ...Array.from(map, ([k,v]) => ({[k]: v})))
示例:
const map = new Map([['id', 123], ['status', 'active']]);
const obj = Object.fromEntries(map);
const jsonStr = JSON.stringify(obj);
// 结果: {"id":123,"status":"active"}
注意事项与限制
序列化 Map 时要注意以下几点:
-
非字符串键会丢失原始类型:比如
true、null、Symbol、对象作键时,转数组保留原样,但转对象时会被强制转为字符串(true → "true",Symbol() → "Symbol()"),反序列化后无法还原 - 函数、undefined、Date、RegExp 等值无法被 JSON 序列化,会自动忽略或报错,需提前处理
-
反序列化需手动还原:JSON 字符串只能表示数据,拿到后要用
new Map(JSON.parse(jsonStr))才能变回Map
完整往返示例(序列化 + 还原)
确保数据可逆,推荐用数组格式:
const originalMap = new Map([['user', {name: 'Bob'}], ['count', 5]]);
// 序列化
const json = JSON.stringify([...originalMap]);
// 反序列化并还原为 Map
const restoredMap = new Map(JSON.parse(json));
console.log(restoredMap.get('user')); // {name: 'Bob'}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











