【问题标题】:JSON.stringify() Does Not Work As ExpectedJSON.stringify() 没有按预期工作
【发布时间】:2015-09-23 06:33:39
【问题描述】:

我已经多次使用JSON.stringify() 并且我知道一些问题,例如(在here 中描述):

  • 循环
  • 对象太深
  • 数组太长

但是,我在对象上面临不正确的字符串化操作,如下所示:

在控制台上运行 JSON.stringify(obj) 后,我明白了。

"[{"$$hashKey":"object:103",
 "ProductCategories": [{"Id":2,"ShopProductCategoryName":"Drink","isSelected":true}
                       {"Id":3,"ShopProductCategoryName":"Food","isSelected":true}]
 }]"

它只会对ProductCategories$$hashKey 进行字符串化,这完全出乎意料。


解决尝试

如果我从 obj 创建新对象并将其字符串化,则返回正确的 JSON。

var newObj = { // Creates new object with same properties.
  AllProductCategories: obj.AllProductCategories,
  Id: obj.Id,
  LabelName: obj.LabelName,
  Percentages: obj.Percentages,
  ProductCategories: obj.ProductCategories
}

JSON.stringify(newObj); // Returns correct JSON.

我使用代码强制将对象发送到 web api,但方式当然不是我想要的。


如我所见,

  • 没有循环。
  • 不是太深。 (只有深度 3)

因此,我无法弄清楚出了什么问题。

【问题讨论】:

  • 请注意,console.log 是异步的,而 JSON.stringify 是同步的。当您调用 stringify 时,您确定您在屏幕截图上显示的属性(看起来来自控制台)已经存在?
  • 没有看到复制问题的代码,我们能做的最好的就是盲目猜测。
  • 它是真实属性,还是继承自原型? JSON.stringify 忽略原型,而 console.log 显示所有可枚举属性。
  • @Juhana 有很多代码可以形成这样的对象,只有JSON.stringify(obj) 存在问题。
  • @doldt console.log 不需要异步,请参阅stackoverflow.com/a/23392650/1092711

标签: javascript json stringify


【解决方案1】:

我建议你创建一个函数来克隆你的对象,而不需要 $$hashKey 我猜是 angular 设置的属性:

function cloneObj (obj) {
   var cloned = JSON.parse(JSON.stringify(obj));
   delete cloned.$$hashKey;
   for(var key in cloned) {
      if(typeof cloned[key] === 'object') {
         cloned[key] = cloneObj(cloned[key]);
      }
   }

   return cloned;
}

在没有$$hashKey 的情况下克隆对象后,您可以毫无问题地对其进行字符串化。

【讨论】:

  • Angular 自带了自己的angular.toJson,省略了 $$ 属性。没有理由手动删除它们。
猜你喜欢
  • 1970-01-01
  • 2019-11-27
  • 2021-10-19
  • 2020-03-18
  • 2012-06-14
  • 2014-11-15
  • 1970-01-01
  • 2012-07-02
  • 2011-09-07
相关资源
最近更新 更多