最常用且推荐的方式是使用 json.stringify() 的 replacer 函数或属性数组。replacer 函数可动态过滤敏感字段,支持模糊匹配和递归处理;属性数组则适合结构固定的白名单场景,简洁安全;服务端应统一脱敏,前端过滤不能替代服务端安全措施。

在 JavaScript 中对 JSON 数据进行序列化时过滤敏感字段(如 password、token、secret 等),最常用且推荐的方式是使用 JSON.stringify() 的第二个参数 —— replacer 函数 或 属性数组。它能在序列化过程中主动跳过指定字段,避免敏感信息意外暴露。
用 replacer 函数动态过滤敏感字段
replacer 是一个函数,接收每个键(key)和值(value),返回要保留的值;若返回 undefined,该字段将被忽略(不会出现在最终 JSON 字符串中)。
- 适用于需要灵活判断的场景(比如字段名含
password、或值为 token 类型) - 可递归处理嵌套对象中的敏感字段
- 注意:key 为空字符串时代表根对象,需单独处理
示例:
const user = {
name: "Alice",
password: "123456",
email: "alice@example.com",
settings: {
theme: "dark",
apiToken: "abc-xyz-789"
}
};
const sensitiveKeys = ["password", "token", "secret", "apiKey", "auth"];
const filteredJSON = JSON.stringify(user, (key, value) => {
if (sensitiveKeys.some(k => key.toLowerCase().includes(k) || k.includes(key.toLowerCase()))) {
return undefined;
}
return value;
}, 2);
console.log(filteredJSON);
// 输出中不含 password 和 apiToken 字段
用属性数组精确控制保留字段(适合已知结构)
如果对象结构固定、只需保留白名单字段,传入字符串数组更简洁安全:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 只保留数组中列出的字段,其余一概不输出
- 天然规避敏感字段,无误删风险(只要白名单不含敏感 key)
- 不支持模糊匹配或条件逻辑
示例:
const user = { id: 1, name: "Bob", password: "hackme", role: "admin" };
const safeFields = ["id", "name", "role"];
const safeJSON = JSON.stringify(user, safeFields, 2);
// → 只包含 id、name、role,password 被自动排除
服务端响应前统一脱敏(Node.js 常见实践)
在 Express/Koa 等框架中,可在发送响应前拦截并过滤响应体,避免每个接口重复写逻辑:
- 封装一个
res.jsonSafe()方法,内部调用带 replacer 的JSON.stringify - 结合中间件,对特定路由(如
/api/users)自动应用过滤规则 - 生产环境建议配合日志脱敏(打印前也过滤)
简单中间件示意:
app.use((req, res, next) => {
const originalJson = res.json;
res.json = function(data) {
const cleanData = JSON.parse(JSON.stringify(data, (k, v) =>
["password", "refreshToken"].includes(k) ? undefined : v
));
return originalJson.call(this, cleanData);
};
next();
});
注意事项与避坑点
实际使用中容易忽略的关键细节:
- replacer 对 Date、undefined、function 等类型有特殊行为:Date 会转为字符串,undefined/function 在对象中会被忽略,在数组中变成 null
- 不要在 replacer 中修改原对象:它只用于读取,修改可能引发副作用
- 前端过滤 ≠ 安全保障:敏感字段必须在服务端生成响应时就剔除;前端过滤仅防误打日志或调试泄露
- 若用
JSON.parse(JSON.stringify(obj))深拷贝+过滤,注意它会丢失函数、undefined、Symbol、Date 对象等
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










