json.stringify 的 replacer 参数支持数组(白名单过滤顶层属性)和函数(可递归过滤嵌套敏感字段),数组不支持路径匹配,函数需返回 undefined 排除字段,且服务端仍须二次校验。

JSON.stringify 的 replacer 参数可以是函数或数组。当用**数组**时,它起到“白名单”作用——只保留数组中列出的属性名,其余一概忽略。这非常适合过滤敏感字段(如 password、token、ssn 等),但要注意:它不是“黑名单”,不能直接写要删除的字段,而是得明确写出**想保留的字段**。
replacer 数组的基本用法
数组中的每一项必须是字符串,代表对象顶层属性名(不支持嵌套路径或正则):
- 只对对象第一层属性生效;嵌套对象需手动处理或改用 replacer 函数
- 如果属性不存在,会被静默跳过,不报错
- 数组顺序不影响输出顺序,JSON 序列化按属性声明顺序(或 ES2015+ 中的插入顺序)
示例:
const user = {
id: 123,
name: "Alice",
password: "123456",
email: "alice@example.com",
token: "abc123"
};
const safeKeys = ["id", "name", "email"];
const json = JSON.stringify(user, safeKeys);
// → {"id":123,"name":"Alice","email":"alice@example.com"}
过滤深层嵌套的敏感字段?数组做不到,得换函数
replacer 数组无法处理 user.profile.token 或 user.address.zipCode 这类嵌套字段。此时必须使用 replacer 函数:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 函数接收两个参数:
key(当前属性名)和value(当前值) - 返回
undefined表示该属性被排除 - 可递归检查 key 路径(配合递归调用或栈记录)
简单敏感字段过滤函数示例:
const sensitiveKeys = new Set(["password", "token", "ssn", "creditCard"]);
function replacer(key, value) {
if (sensitiveKeys.has(key)) return undefined;
return value;
}
JSON.stringify(user, replacer);
// → {"id":123,"name":"Alice","email":"alice@example.com"}
实用建议:结合类型判断 + 安全白名单
仅靠数组或简单函数还不够健壮。推荐组合策略:
- 对已知结构的对象,优先用数组白名单(最简洁、性能好)
- 对不确定结构或含嵌套敏感字段的数据,用 replacer 函数 +
typeof或Array.isArray判断类型,避免误删 - 敏感字段名统一管理(如配置对象或常量 Set),方便审计和维护
- 服务端仍需做二次校验——前端过滤仅用于日志脱敏或调试,不可替代后端权限控制
注意边界情况
以下情况容易出错:
-
undefined、function、Symbol值在任何 replacer 模式下都会被忽略(JSON 标准不支持) - 数组作为 replacer 时,若传入空数组
[],结果是空对象{}(所有属性都被过滤) - key 为
""(空字符串)时代表根对象本身,可用来拦截整个序列化逻辑(较少用)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










