JSON.stringify() не работает должным образом

Я использовал JSON.stringify() много раз и знаю о некоторых проблемах, например (описанных в здесь) :

  • циклы
  • слишком глубокие объекты
  • слишком длинные массивы

Однако я столкнулся с неправильной строкой операции над объектом, которая выглядит так: введите здесь описание изображения

После запуска 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.

Я использовал код для принудительной отправки объекта в веб-апи, но, конечно, это не то, что я хочу.


Как я вижу,

  • Нет циклов.
  • Это не слишком глубоко. (имеет только глубину 3)

Поэтому не могу понять, что не так.


person dewe    schedule 06.07.2015    source источник
comment
Обратите внимание, что console.log является асинхронным, а JSON.stringify — синхронным. Вы уверены, что свойства, которые вы показываете на своем снимке экрана (который выглядит как из консоли), уже присутствуют, когда вы вызываете stringify?   -  person doldt    schedule 06.07.2015
comment
Не видя кода, который воспроизводит проблему, лучшее, что мы можем сделать, — это строить догадки вслепую.   -  person JJJ    schedule 06.07.2015
comment
Это реальные свойства или унаследованные от прототипа? JSON.stringify игнорирует прототип, а console.log показывает все перечисляемые свойства.   -  person Alexey Ten    schedule 06.07.2015
comment
@Juhana есть много кода для формирования такого объекта, есть проблема только с JSON.stringify(obj).   -  person dewe    schedule 06.07.2015
comment
@doldt console.log не обязательно асинхронный, см. stackoverflow.com/a/23392650/1092711   -  person Pavlo    schedule 06.07.2015
comment
Я уверен, что есть, но если мы не можем воспроизвести проблему, ее невозможно решить.   -  person JJJ    schedule 06.07.2015
comment
@doldt Да, я уверен, потому что console.log(obj) и JSON.stringify(obj) последовательные операции.   -  person dewe    schedule 06.07.2015
comment
@AlexeyTen это настоящие объекты   -  person dewe    schedule 06.07.2015
comment
У вас нет метода .toJSON? developer.mozilla.org/en/docs/ Интернет/JavaScript/Справочник/   -  person Alexey Ten    schedule 06.07.2015


Ответы (1)


Что ж, я предлагаю вам создать функцию, которая клонирует ваш объект без свойства $$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, вы можете без проблем преобразовать его в строку.

person Khalid    schedule 06.07.2015
comment
Angular поставляется со своим собственным angular.toJson, в котором отсутствуют свойства $$. Нет смысла удалять их вручную. - person JJJ; 06.07.2015