json.stringify 的 replacer 参数支持数组和函数两种形式:数组指定顶层及显式列出嵌套路径的保留字段;函数则逐层接收 key/value,返回 undefined 可剔除字段,返回其他值可转换内容,实现动态过滤与安全脱敏。

JSON.stringify 的 replacer 参数可用于过滤、重命名或转换对象的属性,它支持两种形式:数组或函数。
用数组指定要保留的属性名
当 replacer 是字符串数组时,它只序列化数组中列出的属性,其余被忽略。适用于已知字段名且结构固定的情况。
- 数组元素必须是字符串,代表对象自身的可枚举属性名
- 如果属性不存在,会被自动跳过,不报错
- 对嵌套对象也生效,但只作用于当前层级
例如:
const obj = { name: "Alice", age: 30, password: "123", email: "a@example.com" };const json = JSON.stringify(obj, ["name", "email"]);
// → '{"name":"Alice","email":"a@example.com"}'
用函数动态控制每个属性的值和是否保留
replacer 函数接收两个参数:key(属性名,根对象为 "")和 value(对应值)。返回值决定该属性如何处理:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 返回 undefined:该属性被完全忽略(包括键和值)
- 返回其他值(含 null):使用返回值替代原值参与序列化
- 注意:不能在函数内修改原对象,否则可能引发意外行为
例如,过滤敏感字段:
const user = {name: "Bob",
token: "abc123",
settings: { theme: "dark", notifications: true }
};
const json = JSON.stringify(user, (key, value) => {
if (key === "token") return undefined; // 过滤掉 token
return value;
});
// → '{"name":"Bob","settings":{"theme":"dark","notifications":true}}'
常见过滤场景与写法技巧
实际开发中常需按规则过滤,比如排除函数、undefined、私有字段或特定类型值:
- 跳过函数和 undefined 值:if (typeof value === "function" || value === undefined) return undefined;
- 忽略以下划线开头的私有属性:if (key.startsWith("_")) return undefined;
- 深层过滤嵌套对象中的敏感字段:在函数中递归判断 key 路径(需自行拼接路径或借助上下文)
- 注意:Date、RegExp 等特殊对象会被默认转成字符串或 null,replacer 可进一步定制
replacer 不会改变原始数据,但要注意引用陷阱
replacer 函数内部操作的是原对象的引用值,所以对 value 做修改(如 value.name = "new")会影响原对象。若需安全处理,建议先浅拷贝或只读访问:
- 避免在 replacer 中修改 value 对象的属性
- 如需脱敏处理,应返回新对象或新值,而非改写原值
- 对数组项也适用:key 为索引字符串(如 "0"、"1"),value 是对应元素
不复杂但容易忽略细节,用好 replacer 能让序列化更精准、更安全。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










