JSON的replacer和reviver是 stringify 与 parse 的钩子函数,分别用于序列化时筛选变形字段、解析时修正还原数据,支持动态过滤、重命名、类型转换,但无法处理函数/Symbol/循环引用。

JSON 的 replacer 和 reviver 是两个可选函数参数,分别用于序列化(JSON.stringify)和解析(JSON.parse)阶段对数据进行定制化处理。它们不是“过滤器”或“转换器”的语法糖,而是深度介入 JSON 编解码流程的钩子函数,能精准控制哪些字段参与、如何重命名、是否跳过、甚至动态改值。
replacer:在 stringify 时筛选和变形输出
replacer 可以是数组或函数:
- 传数组时,只保留键名在该数组中的属性(类似白名单),不支持嵌套路径或条件逻辑
- 传函数时,接收
(key, value)两个参数,在每个层级被调用一次(包括根对象),返回值决定该字段最终表现:
– 返回undefined或不返回值 → 该字段被忽略(删除)
– 返回其他值(含null、字符串、数字等)→ 替换原值
– 注意:若在某个对象中返回一个新对象,它会递归进入该对象继续调用 replacer
示例:隐藏敏感字段并重命名 id 为 _id
const user = {
id: 123,
name: "Alice",
password: "secret123",
profile: { age: 30, email: "a@example.com" }
};
const json = JSON.stringify(user, (key, value) => {
if (key === "password") return undefined; // 过滤
if (key === "id") return `_id_${value}`; // 变形
return value;
});
// 输出:{"_id_123":"Alice","profile":{"age":30,"email":"a@example.com"}}
reviver:在 parse 时修正、还原或增强数据
reviver 必须是函数,签名同 replacer,但执行顺序是从最内层开始向上(自底向上)。它接收 (key, value),返回值将替代当前节点的值。
立即学习“Java免费学习笔记(深入)”;
- 可用于把字符串日期转成
Date对象 - 可恢复被 replacer 改名的字段(如把
_id_123解析回id: 123) - 可做类型校验、默认值填充、甚至拒绝非法结构(抛错)
示例:将 _id_xxx 格式还原为数字 id,并把 created 字符串转为 Date
const jsonStr = '{"_id_123":"Alice","created":"2023-01-01"}';
const data = JSON.parse(jsonStr, (key, value) => {
if (key === "_id_123") {
return { id: parseInt(key.split("_")[1], 10), name: value };
}
if (key === "created" && typeof value === "string") {
return new Date(value);
}
return value;
});
// 结果:{ id: 123, name: "Alice", created: Date object }
注意事项和常见陷阱
-
replacer中的key在根对象时是空字符串"",不是"root"或undefined - 如果
replacer返回一个对象,该对象的自有属性会继续被 replacer 处理(可能引发无限递归,需小心) -
reviver中不能直接修改原始输入对象(没有原始对象可改),它只作用于解析过程中的临时值 - 函数、
undefined、Symbol类型无法被 JSON 序列化,replacer 无法“拯救”它们;它们在 stringify 前已被静默丢弃 - 循环引用对象会直接报错,replacer/reviver 无法绕过此限制(需用第三方库如
flatted)
实用组合:加密字段 + 时间标准化
典型场景:前端发送数据前脱敏 + 后端返回后自动补全类型
- 发送前用 replacer 加密手机号、移除内部字段(如
__tempId) - 接收后用 reviver 将
timestamp转Date,把status_code映射为语义化状态对象 - 注意保持 replacer 和 reviver 的语义对称,避免“存进去一个样,取出来变两个样”
它们不是万能中间件,但足够轻量、标准、无依赖,在数据进出 JSON 边界时提供恰到好处的可控性。


















