通过replacer和reviver函数可实现JSON的高级处理,如过滤敏感字段、序列化函数与循环引用、恢复Date类型及支持Map/Set结构。

在JavaScript中,JSON(JavaScript Object Notation)是最常用的序列化格式之一。虽然JSON.stringify()和JSON.parse()已经能满足大部分基础需求,但在实际开发中,面对复杂数据结构或特殊类型时,需要更高级的处理技巧。
自定义序列化:使用replacer函数
默认情况下,JSON.stringify()无法处理函数、undefined、Symbol等值,还会忽略对象中的循环引用。通过传入replacer参数,可以精细控制序列化过程。
replacer可以是一个函数或数组。作为函数时,它会在每个键值对被序列化前调用:
const user = {
name: 'Alice',
age: 30,
secret: 'password123',
sayHi: function() { console.log('Hi'); },
meta: undefined
};
const json = JSON.stringify(user, (key, value) => {
if (key === 'secret') return undefined; // 过滤敏感字段
if (typeof value === 'function') return '[Function]'; // 标记函数
return value;
});
console.log(json); // {"name":"Alice","age":30,"sayHi":"[Function]"}
恢复复杂数据类型:reviver函数的应用
JSON.parse()的第二个参数是reviver函数,可用于在反序列化过程中转换数据,比如将字符串日期自动转为Date对象。
立即学习“Java免费学习笔记(深入)”;
e网企业2.0
一款适用于中小企业自助建站程序,是c#与xml技术相结合的产物,支持动态设定二级栏目,采用了开放式架构,建站模版自由添加。程序整合了(单一文本,新闻列表,图片列表 ,在线订单, 文件下载 , 留言板)六类插件,以所见即所得的方式,将烦锁的建站过程简化到三步,使用户可以轻松上手。 管理后台:manage.aspx 初始密码均为admin
下载
const data = '{"name":"Bob","birth":"1990-05-12T00:00:00Z"}';
const parsed = JSON.parse(data, (key, value) => {
if (key === 'birth' && typeof value === 'string' && /^\d{4}-/.test(value)) {
return new Date(value); // 自动转为Date
}
return value;
});
console.log(parsed.birth instanceof Date); // true
处理循环引用对象
当对象存在循环引用时,直接使用JSON.stringify()会抛出错误。可以通过replacer配合WeakSet记录已访问对象,跳过重复引用。
function stringifyCircular(obj) {
const seen = new WeakSet();
return JSON.stringify(obj, (key, value) => {
if (typeof value === 'object' && value !== null) {
if (seen.has(value)) {
return '[Circular]';
}
seen.add(value);
}
return value;
});
}
const obj = { name: 'John' };
obj.self = obj;
console.log(stringifyCircular(obj)); // {"name":"John","self":"[Circular]"}
扩展:支持Map、Set等内置类型
原生JSON不支持Map、Set等结构。可通过replacer将其转为普通对象,再用reviver还原。
// 序列化
const cache = new Map([['key1', 'value1']]);
const str = JSON.stringify({ cache }, (k, v) => {
if (v instanceof Map) {
return { __type: 'Map', value: Array.from(v.entries()) };
}
return v;
});
// 反序列化
const restored = JSON.parse(str, (k, v) => {
if (typeof v === 'object' && v?.__type === 'Map') {
return new Map(v.value);
}
return v;
});
console.log(restored.cache instanceof Map); // true
基本上就这些。掌握replacer和reviver的灵活使用,能有效应对大多数JSON处理难题,包括过滤字段、类型恢复、循环引用和扩展数据结构支持。关键是理解它们的执行机制,并结合实际场景设计转换逻辑。