json сериализация странность - PullRequest
1 голос
/ 22 марта 2011

Я использую пользовательский JavaScriptConverter для сериализации двух объектов. Одним из них является список объектов, и он работает просто отлично; другой - один объект. Я сериализирую оба и помещаю их в исходный код страницы. Когда я смотрю на источник HTML в браузере, я вижу, что тот, который работает, выглядит так:

var Object1 = '[{....}]';

в то время как тот, который не работает, выглядит так:

var Object2 = '{...}';

Когда я запускаю eval, он не работает с Object2. Я просто не понимаю, почему сериализация отличается, поскольку я использую один и тот же принципал для обоих; Я явно делаю что-то не так. Если вы столкнулись с подобной проблемой или у вас есть предложение, пожалуйста, дайте мне знать.

Спасибо.

Ответы [ 3 ]

1 голос
/ 22 марта 2011

Вы столкнулись с неоднозначностью синтаксического анализа Javascript.

Вместо:

eval(json)

вам необходимо:

eval('(' + json + ')')

В Javascript открытая фигурная скобка может запускать любой литерал объекта:

{ a: 0, b: 1 }

или блок:

{ var a = 3; f(a); }

Однако блок не может появиться в выражении, поэтому добавление скобок устраняет неоднозначность.

1 голос
/ 22 марта 2011

Раздел 12.4 из В спецификации написано:

ExpressionStatement не может начаться с открывающей фигурной скобкой, потому что это может сделать это двусмысленным с Блок. Кроме того, ExpressionStatement не может начинаться с ключевого слова функции потому что это может сделать это неоднозначным с объявлением функции.

Здесь обсуждаются многочисленные обходные пути / решения:

0 голосов
/ 22 марта 2011

В этом нет ничего странного. В JSON у вас есть нормальные объекты, которые обозначены { ... } и списки нормальных объектов, которые обозначены [{ ... }, { ... }, ...] и. Поэтому, если ваш второй объект не является списком, вы не можете ожидать, что он будет сериализован как таковой. Если вы хотите, чтобы ваш второй объект был заключен в [], вы можете создать список, содержащий один элемент, который является вторым объектом, и затем сериализовать этот список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...