Вызов ошибки JSON.stringify для сложного объекта в Safari

Как уже говорилось, это происходит в Safari, а в Chrome и Firefox все работает нормально.

Я думаю, это потому, что объект, который превратился в json, имеет два свойства, которые содержат объект момента. Я изменил их на объект даты, и функция stringify прошла.

Странно то, что если я попытаюсь выполнить JSON.stringify(moment()), это сработает, поэтому я не уверен, как это отладить и найти, в чем проблема.

Вот скриншот ошибки в Safari:

ошибка

Изменить:

После некоторой отладки я заметил, что эта ошибка возникает после события dhtmlxwindow onclose. Я загружаю частичное представление в окно dhtmlx и создаю там этот объект, который помещается в список, инициализированный в родительском представлении, перед закрытием окна.

Прежде чем закрыть окно, я делаю JSON.stringify(parent.addedContracts), и после события onclose оно работает нормально (у меня там нет кода переопределения), в списке есть тот же объект (я проверил все свойства), но stringify не работает для того же списка.

Изменить:

Создание объекта, который добавляется в список, происходит следующим образом:

var contractStartDate = moment(contractStartDateCalendar.getDate(true), "L");
var contractEndDate = moment(contractEndDateCalendar.getDate(true), "L");

var newContract = {
    Id                  : uniqueId,
    FunctionDesc        : $("#contractFunction").val(),
    ContractHours       : $("#contractHours").val(),
    AdditionalCostFactor: $("#contractAdditionalCostFactor").val().replace(',', '.'),
    VacationFormula     : contractHolidayCostFactor,
    StartDate           : contractStartDate,
    EndDate             : contractEndDate,
    Notes               : Encoder.htmlEncode(tinyMCE.get('contractNotes').getContent()),
    DaysOfWeek          : workingDaysString,
    PlusMinus           : $("#contractTypeDropdown option:selected").data("plusminus"),
    SalaryCalculation   : $("#contractTypeDropdown option:selected").data("salarycalculation"),
    ContractTypeId      : $("#contractTypeDropdown").val(),
    ContractTypeName    : $("#contractTypeDropdown option:selected").text(),
    UploadedImageUrl    : uploadedSignedContractUrl
};

parent.addedContracts.push(newContract);

После этой строки JSON.stringify в порядке, но когда событие закрытия происходит на dhtmlxwindow, что-то меняется, и stringify терпит неудачу.


person Aleks    schedule 17.07.2014    source источник
comment
Вы могли бы попробовать упорядочить моменты в объекте, прежде чем упорядочивать его?   -  person springbo    schedule 17.07.2014
comment
Это исправило бы проблему, но я не хочу передавать все объекты и их свойства перед сохранением, потому что я знаю, что это должно работать, и это только замедлит процесс сохранения.   -  person Aleks    schedule 17.07.2014
comment
Просто чтобы осветить основы, в какой версии Safari вы пытаетесь это сделать?   -  person J E Carter II    schedule 17.07.2014
comment
Есть также некоторые задокументированные предупреждения для объектов String из Moment: momentjs.com/docs/#/parsing /строка   -  person J E Carter II    schedule 17.07.2014
comment
Но свойство _isValid истинно, и это создает момент из строки, так что это не мой случай. Я использую версию 5.1.7 на Windows 8.   -  person Aleks    schedule 17.07.2014
comment
Как вы создаете объект JSON? _isValid как свойство, установленное в строке JSON, сгенерированной в другом месте, ничего не значит для фактической достоверности объекта во время выполнения. Однако было бы полезно, если бы вы создавали свой объект момента, а затем добавляли его к объекту JSON на стороне клиента. Это то, что застанет меня, пока я в окопах, поэтому я подумал, что это стоит подтвердить.   -  person J E Carter II    schedule 17.07.2014
comment
@JECarterII сделал второе редактирование.   -  person Aleks    schedule 17.07.2014
comment
Следующий вопрос... находится ли строка JSON в окне dhtml? Может ли он выйти за рамки, когда вы пытаетесь получить к нему доступ?   -  person J E Carter II    schedule 17.07.2014
comment
Возможно, включите часть вашего скрипта выше, которая закрывает окно dhtmlx.   -  person J E Carter II    schedule 17.07.2014
comment
Сделайте скрипку или дайте нам живую ссылку, где воспроизводится проблема, чтобы нам не пришлось тратить время на настройку всего этого, чтобы помочь вам. Эта проблема довольно странная, и было бы глупо пытаться отладить ее без фактической отладки.   -  person    schedule 28.07.2014
comment
Мне не ясно, что вы упорядочиваете, но понимаете ли вы, что не можете упорядочить объект, если он ссылается на окно, если геттер может дать сбой или если он не ациклический? Связано: stackoverflow.com/questions/13861254/   -  person Denys Séguret    schedule 28.07.2014


Ответы (1)


Независимо от вашей реализации (и поскольку я не могу проверить пример вашего кода, который работает в Safari, но не работает в Chrome), если вы считаете, что реализация JSON ошибочна в Safari, рассмотрите возможность использования полифилла JSON https://bestiejs.github.io/json3/

Что касается будущих вопросов, пожалуйста, покажите нам минимальные примеры того, что не работает. Возможно, это не только даст ответ, который вы искали, но и облегчит нам описание проблемы.

person froginvasion    schedule 06.08.2014