如何利用JSON.parse的reviver函数保留值为undefined的属性?
解决JSON.parse reviver函数保留属性并设置指定值的问题
嘿,我之前也碰到过一模一样的需求,刚好可以给你详细说说怎么处理~
首先得明确核心规则:JSON.parse的reviver函数如果返回undefined(或者没返回值),对应的属性就会被从最终对象里移除。那要保留属性的话,关键就是别让reviver返回undefined,而是返回你想要保留的那个指定值就行。
举个实际例子
假设我们有这样一段JSON字符串:
{ "username": "stephan_g", "email": "", "age": null, "bio": "none" }
我们的需求是:把email、age、bio这些“空值”对应的属性保留,但统一替换成null(你也可以换成空字符串、"N/A"之类的,按需调整)。
原本的reviver可能会写成这样(会删掉这些属性):
const badReviver = (key, value) => { // 遇到空字符串、null、"none"就返回undefined,导致属性被删 if (value === "" || value === null || value === "none") { return; } return value; }; const result = JSON.parse(jsonStr, badReviver); // 结果:{ username: "stephan_g" } 其他属性都没了
现在调整reviver,让它返回我们想要的替换值,而不是undefined:
const goodReviver = (key, value) => { if (value === "" || value === null || value === "none") { // 返回要保留的指定值,这里用null举例 return null; // 要是想换成"N/A"就写 return "N/A"; } // 其他正常值直接返回 return value; }; const result = JSON.parse(jsonStr, goodReviver); // 结果:{ username: "stephan_g", email: null, age: null, bio: null }
注意要点
- 如果你想保留属性,替换值必须是合法的JSON数据类型(null、字符串、数字、布尔值、对象、数组都可以),不能用
undefined——因为一旦返回undefined,属性还是会被删掉。 - reviver函数会递归处理所有嵌套的属性,包括数组元素,所以这个逻辑会自动应用到深层结构里。
- 如果要处理顶层对象(也就是最后一次调用reviver时
key是空字符串的情况),也要注意别返回undefined,否则整个反序列化结果会变成undefined。
内容的提问来源于stack exchange,提问作者Stephan G
相关产品推荐
相关产品推荐

