JSON.stringify()不能按预期工作

时间:2015-07-06 07:46:16

标签: javascript json stringify

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

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

但是,我在对象上面临不正确的字符串化操作,如下所示: enter image description 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)

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

1 个答案:

答案 0 :(得分:0)

好吧,我建议你创建一个克隆你的对象的函数,而不是我想要的$$hashKey属性设置:

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的情况下克隆对象后,您可以毫无问题地对其进行字符串化。