json.stringify 通过 replacer 函数可剔除空值,支持过滤 null、undefined、空字符串、空数组、空对象;需用函数形式判断 value 并返回 undefined 以跳过,0 和 false 默认保留以免误删。

JSON.stringify 本身不直接提供“剔除空值”的功能,但它支持一个叫 replacer 的参数,可以作为过滤器,在序列化过程中动态决定哪些属性保留、哪些跳过。利用这个特性,能简洁地移除 null、undefined、空字符串 ''、空数组 []、空对象 {} 等常见空值属性。
理解 replacer 的工作方式
replacer 可以是数组(指定白名单键名)或函数。要实现“剔除空值”,必须用函数形式:它接收两个参数 —— key 和 value,返回值决定该属性是否被包含在最终 JSON 中。若返回 undefined,该属性就会被忽略(包括对象的字段和数组的元素)。
注意:replacer 函数对每个键值对都会调用一次,包括嵌套对象和数组项;原始值(如数字、布尔)也会进入,但通常无需处理;不能直接修改原对象,所有逻辑基于 value 判断。
基础空值判断逻辑
常见“空值”包括:null、undefined、''、[]、{}、0 和 false 是否算空需按业务定。默认建议保留 0 和 false(它们是有意义的真值),只剔除明显无信息量的值:
value === nullvalue === undefinedvalue === ''Array.isArray(value) && value.length === 0value !== null && typeof value === 'object' && Object.keys(value).length === 0
把这些条件组合进 replacer 函数即可。
写一个可复用的空值过滤 replacer
下面是一个兼顾健壮性和可读性的 replacer 函数:
function removeEmptyValues(key, value) {
if (value == null) return undefined; // 排除 null 和 undefined
if (typeof value === 'string' && value.trim() === '') return undefined;
if (Array.isArray(value) && value.length === 0) return undefined;
if (typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length === 0) return undefined;
return value;
}
// 使用示例
const data = {
name: 'Alice',
age: 0,
email: '',
tags: [],
profile: {},
isActive: false,
address: null
};
const cleaned = JSON.parse(JSON.stringify(data, removeEmptyValues));
// 结果:{ name: 'Alice', age: 0, isActive: false }
注意:这里用了 JSON.parse(JSON.stringify(...)) 实现深拷贝+过滤,适合大多数场景;如果只需序列化而不转回对象,直接用 JSON.stringify(data, removeEmptyValues) 即可。
注意事项与边界情况
有些值需要特别留意,避免误删:
-
0、false、NaN:它们是 falsy,但通常有业务含义,不建议一并过滤 -
new Date()、RegExp、Map、Set:不在标准 JSON 支持范围内,replacer 中需显式处理或忽略,否则可能出错或丢失 - 循环引用:JSON.stringify 会报错,replacer 无法解决,需提前检测或使用第三方库
- 函数和 Symbol:JSON 默认忽略,replacer 中也拿不到,无需额外处理
如果业务要求更严格(比如也要过滤 0 或 false),可在判断逻辑中补充对应条件,但务必确认这是设计意图而非误删。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











