You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止JSON.stringify移除部分数据?已尝试方案无效

解决JSON.stringify忽略不可枚举属性的问题

问题根源

JSON.stringify 默认仅序列化对象中**可枚举(enumerable: true)**的自有属性,你的代码里prop2被定义为enumerable: false,所以会被跳过。

解决方案

1. 修改属性的可枚举性

如果允许修改原对象的属性配置,直接把enumerable设为true即可:

const obj = {
  prop1: 'value1'
};

Object.defineProperty(obj, 'prop2', {
  value: 'value2',
  enumerable: true // 改为true
});

console.log(JSON.stringify(obj)); // 输出: {"prop1":"value1","prop2":"value2"}

2. 使用JSON.stringify的replacer参数

如果不想改动原对象的属性配置,利用第二个参数(替换函数或数组)手动指定要序列化的属性:

方式一:精准指定属性

const jsonStr = JSON.stringify(obj, (key, value) => {
  // 当处理到prop2时返回对应值
  if (key === 'prop2') {
    return obj.prop2;
  }
  return value;
});
console.log(jsonStr); // 输出: {"prop1":"value1","prop2":"value2"}

方式二:遍历所有自有属性(包括不可枚举)

更通用的方式,收集对象所有自有属性后再序列化:

// 收集所有自有属性(不管是否可枚举)
const fullObj = Object.getOwnPropertyNames(obj).reduce((result, key) => {
  result[key] = obj[key];
  return result;
}, {});

console.log(JSON.stringify(fullObj)); // 输出: {"prop1":"value1","prop2":"value2"}

3. 递归处理嵌套对象(复杂场景)

如果对象存在嵌套结构,需要递归遍历所有层级的不可枚举属性,可以封装一个工具函数:

function serializeAllProps(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }
  // 处理数组
  if (Array.isArray(obj)) {
    return obj.map(item => serializeAllProps(item));
  }
  // 处理对象,收集所有自有属性
  return Object.getOwnPropertyNames(obj).reduce((result, key) => {
    result[key] = serializeAllProps(obj[key]);
    return result;
  }, {});
}

console.log(JSON.stringify(serializeAllProps(obj)));

内容的提问来源于stack exchange,提问作者user2106798

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:02:13