json.parse 通过 reviver 函数实现自定义解析逻辑:它自底向上遍历键值对,接收 key 和 value,返回新值替换、undefined 删除、原值保留;可用于日期转换、类型修正、字段过滤等,但不能处理语法错误、循环引用或修改原型。

JSON.parse 本身不支持直接传入“解析器函数”来修改结构,但可以通过它的第二个参数 reviver 函数 实现自定义转换逻辑。
reviver 参数的作用机制
reviver 是一个可选的函数,会在 JSON 解析完成、生成原始 JS 对象后,**自底向上(从最内层属性开始)遍历每个键值对**,允许你修改或过滤值。它接收两个参数:key(当前属性名,根对象为空字符串)和 value(当前属性值)。
返回值决定最终保留什么: - 返回新值 → 替换原值 - 返回 undefined → 删除该属性(包括数组中对应位置变为 undefined,但不会改变数组长度) - 不返回(即 return 或 void)→ 相当于返回 undefined - 返回原 value → 保持不变
常见自定义转换场景与写法
以下操作都靠 reviver 完成:
- 字符串转日期对象:识别形如 "2023-10-05T14:30:00Z" 的字段,自动 new Date();
- 数字字符串转 Number:对特定 key(如 "id", "score")尝试 parseInt/parseFloat;
- 统一字段名大小写:把所有 key 转为驼峰(如 "user_name" → "userName"),需配合 Object.keys + Object.assign 重建对象(注意:reviver 中不能直接改 this,需返回新对象);
- 过滤敏感字段:遇到 "password"、"token" 等 key 直接返回 undefined;
- 类型校验与降级:比如期望是布尔但得到字符串 "true",可转为 true;若值非法,返回 null 或默认值。
注意事项和限制
reviver 无法改变原始 JSON 文本的语法结构(比如跳过注释、处理单引号、解析 NaN/Infinity),这些必须在 parse 前预处理。它也不适用于:
- 修改对象原型或添加不可枚举属性(reviver 返回的对象是普通 plain object);
- 对数组索引做“重排序”(只能删或替换值,不能移动位置);
- 处理循环引用(JSON 标准本身不支持,会报错,reviver 不介入);
- 拦截或修改解析过程中的错误(如语法错误仍会 throw SyntaxError)。
一个实用示例:自动转换日期和清理空值
假设后端返回:
{"created_at":"2024-03-15T08:22:10Z","name":"Alice","age":"30","meta":null}
用 reviver 处理:
const data = JSON.parse(jsonStr, (key, value) => {
if (key === 'created_at' && typeof value === 'string') {
return new Date(value);
}
if (key === 'age' && typeof value === 'string') {
return Number(value);
}
if (value === null) {
return undefined; // 删除 null 字段
}
return value;
});
结果中 created_at 是 Date 实例,age 是数字,meta 字段消失。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











