map不能直接json序列化,因为json.stringify()仅支持基础类型,而map是内置对象且内部结构不符合json规范,直接序列化返回空对象{};需通过array.from(map)转为二维数组再序列化,反序列化时用new map(json.parse(jsonstr))还原。

JavaScript 的 Map 对象本身不能被直接 JSON 序列化(JSON.stringify() 会忽略它),也不能用 JSON.parse() 直接还原。要实现 Map 和 JSON 的互转,需手动处理键值对的格式转换。
为什么 Map 不能直接 JSON 序列化?
JSON.stringify() 只能处理 plain object、array、string、number、boolean、null 这些基础类型。而 Map 是一个内置对象,其内部结构(如迭代器、键类型不限等)不满足 JSON 规范。直接传入会得到空对象 {}:
const map = new Map([['a', 1], [true, 'yes']]);
console.log(JSON.stringify(map)); // "{}" —— 不是预期结果
序列化 Map:转成可 JSON 化的数组格式
利用 Map.prototype.entries() 获取键值对迭代器,再转为二维数组(每个元素是 [key, value]),这种结构可以被 JSON 安全序列化。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 注意:原始 key 类型(如
Symbol、函数、undefined)无法被 JSON 表示,需提前处理或限制使用字符串/数字/布尔值作为 key - 推荐只对字符串、数字、布尔值、null 等 JSON-safe 类型的 key 做序列化
function mapToJson(map) {
return JSON.stringify(Array.from(map));
}
// 示例
const map = new Map([['name', 'Alice'], [42, 'answer'], [true, 'active']]);
const json = mapToJson(map);
console.log(json); // [["name","Alice"],[42,"answer"],[true,"active"]]
反序列化 JSON:从数组重建 Map
用 JSON.parse() 得到二维数组后,直接传给 new Map() 构造函数即可还原(前提是数组格式正确,且 key/value 类型兼容)。
- 确保 JSON 字符串解析后是数组,且每个子项是长度为 2 的数组(
[key, value]) - 如果原始 key 是 Date、RegExp 等对象,需额外解析逻辑(JSON 不保留对象类型,只能存字符串再手动恢复)
function jsonToMap(jsonStr) {
const arr = JSON.parse(jsonStr);
return new Map(arr);
}
// 示例
const map2 = jsonToMap(json);
console.log(map2.get('name')); // "Alice"
console.log(map2.get(42)); // "answer"
进阶:支持嵌套 Map 或自定义类型 key
若需保存非 JSON-safe key(如 Date、Set),可在序列化前将其转为可序列化形式(例如 ISO 字符串),反序列化时再还原:
- 序列化时:检查 key 类型,
instanceof Date→date.toISOString(),并加类型标记 - 反序列化时:根据标记重建对应对象,再设入 Map
- 更通用的做法是封装成带 schema 的编解码器,但日常场景中建议尽量用字符串 key 避免复杂性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










