json.stringify 通过 replacer 参数实现字段过滤:数组方式白名单保留顶层字段,函数方式支持深度动态过滤,tojson() 方法封装序列化逻辑,object.defineproperty 隐藏不可枚举属性。

JavaScript 中 JSON.stringify 本身不提供“过滤字段”的独立 API,但通过它的第二个参数 replacer,可以灵活控制哪些字段参与序列化——这是最常用、最可靠的方式。
用数组白名单精确保留字段
适合已知要保留哪些字段的场景,简洁直接,不写逻辑:
- 传入一个字符串数组,只包含你想保留的顶层属性名
- 该方式不会递归生效,嵌套对象里的字段仍会全部保留
- 对敏感字段(如
password、token)做粗粒度排除很高效
示例:
const user = { id: 1, name: "Tom", password: "123", email: "t@ex.com", settings: { theme: "dark", debug: true } };
const result = JSON.stringify(user, ["id", "name", "email"]);
// → {"id":1,"name":"Tom","email":"t@ex.com"}
// settings 整个被跳过,哪怕你只想留 theme 也不行
用 replacer 函数动态过滤每一层
真正实现“按需过滤”的核心方式,支持条件判断、类型检查、路径追踪:
- 函数接收
(key, value),返回undefined表示剔除该字段 - 会逐层遍历,包括嵌套对象和数组项,天然支持深度过滤
- 可识别敏感字段、空值、默认值、函数/Symbol 等不可序列化内容
常见写法:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
JSON.stringify(obj, (key, value) => {
if (key === "password" || key === "token") return undefined;
if (value == null || value === "") return undefined; // 过滤 null / undefined / 空字符串
if (typeof value === "function" || typeof value === "symbol") return undefined;
return value;
});
借助 toJSON() 方法定制序列化结构
在对象自身定义 toJSON(),让 JSON.stringify 自动调用它来获取待序列化的纯净副本:
- 无需每次调用都传 replacer,逻辑封装在对象内部
- 适用于固定结构的类或构造器实例,比如用户模型、配置对象
- 注意:仅对该对象生效,不作用于子对象(除非子对象也实现了 toJSON)
示例:
const user = {
name: "Alice",
password: "xxx",
email: "a@b.com",
toJSON() {
return { name: this.name, email: this.email };
}
};
JSON.stringify(user); // → {"name":"Alice","email":"a@b.com"}
用 Object.defineProperty 隐藏不可枚举属性
从源头让字段“不可见”,JSON.stringify 默认只处理可枚举属性:
- 设置
enumerable: false后,该属性既不会出现在for...in,也不会被JSON.stringify处理 - 属性值依然存在,只是不参与序列化和遍历,适合临时隐藏敏感字段
- 注意:不能用于数组索引或动态生成的键;兼容性良好,但需手动设置每个字段
示例:
const obj = { a: 1, b: 2 };
Object.defineProperty(obj, "secret", {
value: "hidden",
enumerable: false
});
JSON.stringify(obj); // → {"a":1,"b":2}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










