JSON.parse 的 reviver 参数是在解析时自底向上处理每个键值对的函数,可识别并安全转换 ISO 8601 格式字符串或指定字段名为 Date 对象,需校验合法性并避免误转。

JSON.parse 的 reviver 参数是解析过程中对每个键值对进行二次处理的关键入口,它能让你在数据刚从字符串转为对象的瞬间,就识别并转换形如日期字符串的字段为真正的 Date 对象。
reviver 的执行机制和触发时机
reviver 是一个函数,接收两个参数:key(当前属性名)和 value(当前属性值)。它在 JSON 解析树的每个节点上自底向上递归调用(先子后父),返回值会替代原 value;若返回 undefined,则该属性会被从结果中删除。
关键点在于:只有原始 JSON 字符串中明确写成字符串(如 "2023-10-05T14:30:00Z")的字段才会进入 reviver;而数字、布尔、null 等类型不会被误判为日期。
识别并转换常见日期格式的字符串
不是所有字符串都要转成 Date。应通过正则或内置方法判断是否符合 ISO 8601 格式(如 "2023-10-05T14:30:00.123Z" 或带时区偏移的 "2023-10-05T14:30:00+08:00"),再安全构造 Date 实例。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
- 优先使用
new Date(value)构造,然后检查isNaN(date.getTime())来排除非法日期(如 "2023-13-01") - 避免仅靠
value.includes('T')这类模糊匹配,防止把普通含 T 的字符串(如 "TASK_COMPLETE")误转 - 如果后端约定日期字段名固定(如 "createdAt"、"updatedAt"),可在 reviver 中按 key 名精准转换,更可靠
实际可用的 reviver 示例
下面是一个兼顾 ISO 格式识别与字段名约定的通用写法:
const data = JSON.parse(jsonStr, (key, value) => {
// 按字段名约定转换(推荐用于结构清晰的 API)
if (key === 'createdAt' || key === 'updatedAt' || key === 'expiresAt') {
return value && typeof value === 'string' ? new Date(value) : value;
}
// 或按值内容自动识别 ISO 日期字符串
if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?$/.test(value)) {
const date = new Date(value);
return isNaN(date.getTime()) ? value : date;
}
return value;
});
注意事项和边界情况
reviver 不会改变原始 JSON 字符串本身,只影响最终 JS 对象的结构。需注意:
- 嵌套对象中的日期字符串同样会被 reviver 捕获,无需额外递归处理
- 数组元素也会触发 reviver,此时 key 是索引(如 "0"、"1"),value 是对应项,可统一处理
- 如果 Date 构造失败(如传入空字符串或 null),
new Date(null)返回 Invalid Date,务必用isNaN(date.getTime())判定 - reviver 中修改 value 不会影响其他同名字段——它是纯函数式处理,每次调用独立

















