Ошибка синтаксического анализа JSON при использовании jQuery.parseJSON - PullRequest
1 голос
/ 19 ноября 2010

Этот код завершается с ошибкой, указывающей на недопустимый JSON:

var example = '{ "AKEY": undefined }';
jQuery.parseJSON(example);

Мне удалось исправить это, заменив все неопределенные пустые строки.Не определены ли не являются частью JSON?

Ответы [ 4 ]

4 голосов
/ 19 ноября 2010

Если вы можете обдумать это, токен undefined фактически не определен.

Позвольте мне уточнить: даже если в JavaScript есть специальное примитивное значение, называемое undefined, undefined является , а не ключевым словом JavaScript, и не имеет никакого особого значения.Вы можете нарушить код, который проверяет наличие объекта, сравнивая его с undefined, определяя его.

var obj = { BKEY: 'I exist!' };
if (obj.AKEY == undefined) console.log ('no AKEY');
if (obj.BKEY == undefined) console.log ('should not happen');

undefined='uh oh';

if (obj.AKEY == undefined) console.log ('oops!'); // Logically, we want this to execute, but it will not!
if (obj.BKEY == undefined) console.log ('should not happen');

Единственным выходом консоли будет 'no AKEY'.После того, как мы присвоили глобальной переменной undefined, obj.AKEY == undefined становится ложным, потому что <i>undefined</i> != 'uh oh'.obj.BKEY == undefined все еще возвращает ложь, но только потому, что нам повезло.Если бы я установил obj.BKEY='uh oh', то obj.BKEY == undefined был бы true , , даже если он действительно существует !

Вы, вероятно, хотите, чтобы для Explicity установитьnull.(Кстати, null - это ключевое слово; null='uh oh' выдает исключение).

Вы также можете просто пропустить AKEY из своего JSON, в этом случае вы найдете:

typeof(example.AKEY) == 'undefined'

(Если вы установите AKEY на null, то typeof(example.AKEY) == 'object'.)

Единственная реальная разница между установкой на ноль и пропуском заключается в том, хотите ли вы клавишупоявляться в цикле foreach.

4 голосов
/ 19 ноября 2010

Нет, но null есть. RFC 4627 §2.1 :

Значение JSON ДОЛЖНО быть объектом, массивом, число, или строка, или один из следующие три буквальных имени:

  false null true
var example = '{ "AKEY": null }';
1 голос
/ 19 ноября 2010

Они не разрешены в JSON ... посмотрите на альтернативу, и понятно, почему:

var example = '{}';
var obj = jQuery.parseJSON(example);
obj.AKEY //undefined

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

1 голос
/ 19 ноября 2010

Правильно. Не определено и функции не представлены в JSON. http://www.json.org/js.html

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