JSON.parse()无法直接还原Map,需约定格式如二维数组,序列化用Array.from(map),解析后用new Map(JSON.parse(str))重建。

JavaScript 原生的 JSON.parse() 无法直接还原出 Map 对象,因为 JSON 标准不支持 Map 类型,序列化时它会被转成普通对象({})或丢失结构。要将 JSON 字符串“解析并重建”为 Map,需要手动处理——关键在于**区分哪些对象本应是 Map,并在解析后逐层转换**。
明确:JSON 本身不存 Map,需约定格式
由于 JSON 是纯数据格式,没有类型信息,所以必须提前约定一种可识别的标记方式,例如:
- 用特殊字段(如
"__type": "Map")标识该对象原为 Map; - 或约定某一层级的键值对(如
{"keys": [...], "values": [...]})对应 Map 的 entries; - 更常见的是:把 Map 序列化为二维数组(
[["k1","v1"], ["k2","v2"]]),这是最简洁、无歧义的方式。
推荐做法:序列化时用 Array.from(map) → 解析后用 new Map()
✅ 最可靠、易读、无侵入性的方案是:
- 保存前:
JSON.stringify(Array.from(myMap))(得到类似[["a",1],["b",2]]的字符串); - 还原时:
new Map(JSON.parse(jsonStr))—— 直接传入解析后的二维数组即可。
示例:
立即学习“Java免费学习笔记(深入)”;
const originalMap = new Map([['name', 'Alice'], ['age', 30]]);
const jsonStr = JSON.stringify(Array.from(originalMap)); // "[["name","Alice"],["age",30]]"
// 还原
const parsedArr = JSON.parse(jsonStr);
const restoredMap = new Map(parsedArr); // Map(2) {"name" => "Alice", "age" => 30}
复杂嵌套中还原 Map(需自定义 reviver)
如果 JSON 字符串里有多个位置嵌套了 Map(比如配置对象中某个字段是 Map),可用 JSON.parse(json, reviver) 配合识别逻辑:
- 约定 Map 数据以特定键名出现(如
"headers"字段总是 Map); - 或在序列化时主动加上类型标记(如
{"__map": true, "data": [["k","v"]]}); - 在
reviver中检测到该结构,就用new Map(value.data)替换。
示例(带标记):
// 序列化时:
const obj = { settings: { __map: true, data: [["theme","dark"], ["lang","zh"]] } };
const json = JSON.stringify(obj);
// 解析时:
const mapObj = JSON.parse(json, (key, value) => {
if (value && typeof value === 'object' && value.__map && Array.isArray(value.data)) {
return new Map(value.data);
}
return value;
});
// mapObj.settings 是 Map 实例
注意:不能直接 JSON.parse(...) 得到 Map
❌ 错误写法:
// 这样不行:JSON 不认识 Map,解析结果只是普通对象
const bad = JSON.parse('{"a":1,"b":2}');
console.log(bad instanceof Map); // false
⚠️ 即使你尝试 new Map(JSON.parse(...)),也仅当原始 JSON 是二维数组格式才有效;若传入普通对象,会报错或创建空 Map。


















