2016-02-29 2 views
0

В моем приложении я получаю данные JSON. Если я попытаюсь сохранить эти данные как глобальные, пройдите через JSON.stringify(), а затем через JSON.parse() он не будет возвращен как объект, а как строка. stringify шаг возвращает вдвойне закодированную строку:Javascript строит JSON дважды

enter image description here

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

+0

Задает ли 'Object' внутри массива' products' метод 'toJSON'? –

+2

Является ли ваш объект уже «строгим», когда вы вызываете 'stringify'? 'console.log (typeof obj)' – tymeJV

+0

@dr_debug нет более релевантного кода ... Объект был вытащен свежим с вкладки «Сеть», а объект JSON является родным ... – ecc

ответ

0

Прежде всего, зачем вам нужно строгать, а затем анализировать его для глобального контекста. Поскольку вы можете напрямую сохранить объект в глобальном.

Приходится на ваш скриншот, при первом выполнении строгая, в этот момент переменная не была объектом. Вы можете проверить тип. Кажется, вы строкой строки. Может быть, не в консоли, но в коде вы выровняли глобальную переменную и снова сделали то же самое в консоли. Проверьте свой код.

+0

Уверяю вас, что ничего не произошло, и переменная, переданная в stringify, действительно является объектом, напечатанным в первой строке. Что касается прецедента, мне нужно его укрепить, чтобы сохранить его в локальном хранилище, а затем прочитать его в какой-то момент в будущем. – ecc

+0

Да, конечно, объект должен быть сжат перед хранением в локальном хранилище. Но я уверен, что первым результатом вашей строки является то, что вы строкой string. Придя к особой теме, которую вы упомянули, я не согласен.Но все же вы можете попытаться удалить ключи url и base64 в качестве значений до того, как будете стягиваться. Лучше мы можем решить, если вы создадите скрипку. Или вы можете опубликовать снимок экрана с записью точного значения, которое вы получаете с сервера на консоль (без синтаксического разбора/без строчек). –

0

Я выяснил, кто был виновником: прототип. Я узнал через консоль, что Prototype был загружен в неисправную систему магазинов. Я решил ее путем удаления материала, который вызывает проблему:

if (window.Prototype) delete Array.prototype.toJSON; 

Я посмотрел его и метод stringify фактически вызывает toJSON если таковые имеются. Прототип перекрывал его и закручивал.

1

По запросу от @ecc это было перемещено из комментария к ответу.

Попробуйте использовать

JSON.stringify(products.toJSON()) 

Я не думаю, что это является необходимым нормальное поведение, хотя я с трудом, объясняя, почему это необходимо в данном случае. Обычно функция toJSON() вызывается автоматически внутри функции stringify.

EDIT: Я только что видел ваш ответ, объясняет это!

Смежные вопросы