Ошибка JSON-анализа с помощью jQuery.parseJSON

Этот код выходит из строя с исключением, указывающим недействительный JSON:

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

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

Ответы

Ответ 1

Если вы можете обернуть свою голову вокруг этого, токен undefined на самом деле 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 станет false, потому что undefined != 'uh oh'. obj.BKEY == undefined по-прежнему возвращает false, но только потому, что нам повезло. Если бы я установил obj.BKEY='uh oh', то obj.BKEY == undefined был бы true, хотя он действительно существует!

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

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

typeof(example.AKEY) == 'undefined'

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

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

Ответ 2

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

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

  false null true
var example = '{ "AKEY": null }';

Ответ 4

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

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

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