如何用JSON.parse的Reviver参数将日期字符串自动还原为对象

落静同学_9462

落静同学_9462

2026-04-23

267人浏览

原创

reviver 必须手动判断 iso 日期字符串并转换为 date 实例,仅靠 typeof value === 'string' 会误转非日期字符串;需用正则匹配 /^\d{4}-\d{2}-\d{2}t\d{2}:\d{2}:\d{2}/ 并校验 new date().gettime() 有效性,且每次必须 return 值以避免 undefined。

如何用json.parse的reviver参数将日期字符串自动还原为对象

JSON.parse 的 reviver 参数到底怎么写才生效

reviver 不是自动识别日期的魔法开关,它只负责逐个处理解析后的每个键值对。你必须自己判断哪些字符串长得像日期,再手动用 new Date() 转换。默认情况下,所有值都原样返回,不加干预就等于没写 reviver。

常见错误是把正则写成全局匹配(/^\d{4}-\d{2}-\d{2}T/),但 reviver 每次只传入一个 value,且原始 JSON 里日期通常已是 ISO 字符串(如 "2023-10-05T14:30:00.000Z"),直接比格式更稳:

JSON.parse(jsonStr, (key, value) => {
  if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(value)) {
    return new Date(value);
  }
  return value;
});

为什么不能只靠 typeof value === 'string' 就转

因为 JSON 里所有时间字段都是字符串,但不是所有字符串都是日期。比如 "id"、"email"、"2023-10"(年月)或 "2023/10/05"(非 ISO)都会误判。

  • 只检查类型不检查格式,会把普通字符串也变成 Invalid Date
  • ISO 8601 格式最可靠:YYYY-MM-DDTHH:mm:ss.sssZ 或带时区偏移的变体
  • 如果后端返回的是 Unix 时间戳数字(如 1696516200000),那得单独判断 typeof value === 'number' 并跳过字符串逻辑

reviver 中修改对象属性时要注意 key 的作用域

reviver 的 key 是当前遍历的属性名(根对象为 ""),value 是它的值。你不能在 reviver 里直接改原对象,所有转换必须通过 return 实现。返回值会替换该层级的值 —— 这意味着嵌套对象里的日期也能被递归处理,但你得确保逻辑覆盖到每一层。

Browser Js
Browser Js

轻量级CDP浏览器控制,适用于AI代理。相较于内置浏览器工具,token消耗降低3‑10倍,仅在浏览时使用。

下载

典型陷阱:

  • 写了 if (key === 'createdAt') { return new Date(value); } → 只能捕获固定字段名,漏掉 updatedAt、dateOfBirth 等
  • 在 reviver 里对 value 做了 value.setHours(...) → 报错,因为此时 value 还是字符串,不是 Date 实例
  • 忘记 return 原值 → 未匹配的字段会变成 undefined,整个数据结构被破坏

实际项目中建议封装成可复用函数

硬编码正则和 new Date() 在每个 JSON.parse 调用里重复写,既易错又难维护。抽成函数后还能统一处理无效日期(比如返回 null 而不是 Invalid Date):

const reviveDate = (key, value) => {
  if (typeof value === 'string') {
    const date = new Date(value);
    if (!isNaN(date.getTime()) && value.match(/^\d{4}-\d{2}-\d{2}T/)) {
      return date;
    }
  }
  return value;
};

// 使用
const data = JSON.parse(jsonStr, reviveDate);

注意:Date 构造函数对某些非法字符串(如 "2023-02-30")也会静默返回 Invalid Date,所以必须配合 isNaN(date.getTime()) 校验。

真正麻烦的是混合格式——比如部分接口用 ISO,部分用秒级时间戳,部分用中文格式。这种时候 reviver 得叠加多条件判断,而不是指望一个正则通吃。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2035

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

2962

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

996

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3339

7

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

120

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

100

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

80

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.8万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习