2013-03-15 3 views
0

Я получаю некоторые данные в формате JSON, самый простой пример, который держит один ряд является:Не можете разобрать этот JSON с JQuery

{ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] } 

кажется, хорошо образован:

>>> console.log({ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] }) 
Object { max=[1]} 

Хотя, если я стараюсь:

>>> $.parseJSON("{ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] }"); 

SyntaxError: JSON.parse: expected property name or '}' 

Почему это?

Спасибо, ребята, я не осознавал различия между Обозначением объекта JavaScript и строгим JSON. Я изменил его на выходе, как это:

{ "max": [[1353007547000,70.0000]] } 

Контекст этих данных был для загрузки некоторых данных Highcharts с помощью Ajax, но все примеры были выше в SANS формате Ajax.

+1

Ну ... ваш JSON недействителен.* «Кажется, что он хорошо сформирован» *: В этом случае вы интерпретируете его как JavaScript, и это действительный объектный литерал, но это нечто иное, чем JSON. –

+4

Неверно - сначала проверьте его http://jsonlint.com/ – Terry

ответ

2

Вы все еще имеем дело в объекте JavaScript , который JSON-как, а не истинный формат JSON. Для .parseJSON вам нужен строгий JSON.

Это означает, что объект Date должен быть строкой, а ваши имена свойств должны быть в двойных кавычках.

Инструменты, такие как http://jsonlint.com/, могут быть очень полезными.

@ c4p предлагает сначала использовать JSON.stringify на вашем JavaScript-объекте, и это часто является хорошим первым шагом, поскольку он часто обрабатывает множество вещей, которые необходимо скорректировать до разбора.

+0

* «Объект JavaScript, похожий на JSON» *, кажется мне очень странным ... объектная буквальная запись и JSON не имеют ничего общего, кроме того, что это было вдохновленный другим. Я думаю, что ваше утверждение делает разницу между буквальным синтаксисом и JSON только более запутанным. –

+0

@FelixKling Я согласен, что фраза действительно странная. Тем не менее, я часто обнаружил, что, описывая это различие для людей, которые новее думают о различии между объектами JSON и JavaScript, важно сначала дать понять их неопределенным сходствам. Хотя это может показаться странным для вас или для меня, это потому, что мы уже понимаем основное различие между буквальным синтаксисом и обозначением. Возможно, было бы лучше сказать, что объекты JavaScript могут часто выглядеть похожими на JSON (JavaScript Object Notation), но сходство заканчивается, как только вы заканчиваете свой внешний вид. – purgatory101

7

JSON - это строгий стандарт, который является подмножеством Javascript. Date - это одна из этих вещей, которую она не допускает - если вы хотите дату, вам придется передать ее как строку (или int). Вы используете код JavaScript, но не действительны JSON.

1

Если дамп объект Javascript в формате JSON:

JSON.stringify({ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] }); 

"{"max":[[1361538673000,999]]}" 

Обратите внимание на ключ max стала строка "max" и Date был преобразован в метку времени.

0

Дата является объектом javascript и не является частью JSON. Вы пытаетесь передать вызов функции javascript через сериализованную форму, и это не сработает.

Причина, по которой она работает в журнале консоли, связана с тем, что функция Date.UTC разрешена в значение до вызова console.log. Похоже, что эта строка была первоначально настроена с целью передачи в eval (который выполняет буквенный javascript), который может выполнять эту функцию, и вы пытаетесь сделать ее менее уязвимой, используя parseJSON (что хорошо!).

Решение здесь зависит от того, сколько у вас контроля над данными JSON, которые вы получаете. Если у вас есть нулевой контроль, вы можете быть вынуждены использовать eval. В противном случае json должен содержать массив params (или самой метки времени), переданный в UTC, и когда он был разобран, вам нужно вывести Date.UTC на результат, чтобы получить вашу дату UTC.

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