json.parse 的 reviver 参数可遍历每个键值对,识别并安全转换 iso 8601 格式日期字符串(如"2024-05-20t14:30:00.000z")为 date 对象,支持嵌套结构,但仅限标准 iso 格式且需校验有效性。

JSON.parse 的 reviver 参数可以在解析过程中遍历每个键值对,借此识别字符串形式的 ISO 日期,并将其还原为真正的 Date 对象——这是实现「带日期修复的深拷贝」最轻量、最标准的方式。
识别并转换 ISO 格式日期字符串
JavaScript 原生 JSON 不支持 Date 类型,序列化后会变成 ISO 字符串(如 "2024-05-20T14:30:00.000Z")。reviver 可在解析时检查该字符串是否符合 ISO 日期格式,并尝试构造新 Date:
- 用正则粗筛:
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/.test(value) - 再用
new Date(value)构造,然后验证有效性(!isNaN(date.getTime())) - 只对字符串类型做处理,避免干扰数字、布尔等其他值
reviver 函数的正确写法
reviver 是一个接收 key 和 value 的函数,必须显式返回要保留/替换的值:
const revived = JSON.parse(jsonStr, (key, value) => {
if (typeof value === 'string') {
const date = new Date(value);
if (date instanceof Date && !isNaN(date.getTime()) && date.toISOString() === value) {
return date;
}
}
return value; // 必须返回原值,否则该属性会被删除
});
注意:date.toISOString() === value 这一判断可排除形如 "123" 或 "2024-01-01"(无时间部分)等非标准 ISO 字符串,避免误转。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
处理嵌套对象与数组中的日期
reviver 会递归访问所有层级的属性(包括数组元素),因此无需额外循环。例如以下 JSON:
{
"created": "2024-05-20T08:00:00.000Z",
"events": [
{"at": "2024-05-20T10:30:00.000Z"},
{"at": "2024-05-20T11:45:00.000Z"}
]
}
经上述 reviver 解析后,revived.created 和 revived.events[0].at 都是 Date 实例,而非字符串。
局限性与注意事项
该方法简洁高效,但有几点需留意:
- 仅适用于标准 ISO 8601 字符串(含时区 Z 或 +00:00),不支持
"2024/05/20"或"May 20, 2024"等格式 - 无法区分「本意就是字符串的 ISO 时间」和「本意是 Date 的 ISO 时间」,需约定数据协议
- 若原始对象含自定义序列化逻辑(如
toJSON()方法),应确保它输出标准 ISO 字符串 - 不处理
undefined、Function、Symbol等无法被 JSON 序列化的类型
如需更通用的克隆(比如支持 Map/Set/BigInt/RegExp),应搭配专用库(如 lodash.cloneDeepWith),但纯日期修复场景下,reviver 已足够精准可靠。










