json.stringify() 的 replacer 参数支持函数或数组,函数可动态过滤敏感字段;接收 key 和 value,返回 undefined 则忽略该字段,否则用返回值替代原值;支持嵌套结构深层过滤,但需注意误过滤风险,推荐结合白名单或类型判断提升安全性。

JSON.stringify() 的 replacer 参数可以是函数或数组,用函数时就能动态决定哪些字段保留、哪些过滤——这是过滤敏感字段最常用也最灵活的方式。
replacer 函数的基本逻辑
replacer 函数接收两个参数:key(当前属性名)和 value(当前属性值)。它在序列化每个属性前被调用,返回值决定该属性如何处理:
- 返回
undefined或不返回(即隐式返回 undefined),该属性会被完全忽略(不进入最终 JSON 字符串) - 返回其他值(包括
null),则用该值替代原 value 参与序列化 - 注意:对顶层对象(key 为空字符串
""),value 是整个待序列化对象
过滤常见敏感字段(如 password、token、secret)
定义一个黑名单数组,检查 key 是否匹配,匹配则返回 undefined:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const user = {
name: "张三",
password: "123456",
email: "zhang@example.com",
token: "abc123xyz",
age: 28
};
const sensitiveKeys = ["password", "token", "secret", "apiKey"];
const json = JSON.stringify(user, (key, value) => {
if (sensitiveKeys.includes(key)) {
return undefined; // 过滤掉
}
return value;
});
// 输出:{"name":"张三","email":"zhang@example.com","age":28}
支持嵌套对象和数组的深层过滤
replacer 函数会递归作用于所有层级,所以无需额外处理嵌套结构。只要字段名匹配,无论在哪一层都会被过滤:
const data = {
id: 1,
profile: {
name: "李四",
password: "7890",
settings: { theme: "dark", apiToken: "tok-456" }
},
tokens: ["a", "b", "c"]
};
const json = JSON.stringify(data, (key, value) => {
if (["password", "apiToken", "tokens"].includes(key)) {
return undefined;
}
return value;
});
// 输出:{"id":1,"profile":{"name":"李四","settings":{"theme":"dark"}}}
注意:tokens 数组整个被移除;apiToken 在嵌套对象中也被清除。
更安全的做法:显式白名单 + 类型判断
仅靠 key 名过滤可能误伤(比如字段名含 “password” 但实际不是敏感值)。可加简单类型/上下文判断,或改用白名单方式更可控:
- 只保留明确允许的 key(适合字段稳定、数量少的场景)
- 对 value 做类型检查,例如
typeof value === 'string' && value.length > 50可能是 token - 避免在 replacer 中修改原对象,它只用于“读取”和“决定输出”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










