Этот код выходит из строя с исключением, указывающим недействительный JSON:
var example = '{ "AKEY": undefined }';
jQuery.parseJSON(example);
Мне удалось исправить это, заменив все неопределенные пустые строки. Не определены ли они не в JSON?
Этот код выходит из строя с исключением, указывающим недействительный JSON:
var example = '{ "AKEY": undefined }';
jQuery.parseJSON(example);
Мне удалось исправить это, заменив все неопределенные пустые строки. Не определены ли они не в JSON?
Если вы можете обернуть свою голову вокруг этого, токен 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.
Нет, но null
есть. RFC 4627 §2.1:
Значение JSON ДОЛЖНО быть объектом, массивом, номер или строку, или один из следующие три буквальных имени:
false null true
var example = '{ "AKEY": null }';
Правильно. Undefined и функции не представлены в JSON. http://www.json.org/js.html
Они не разрешены в JSON... посмотрите на альтернативу и ясно, почему:
var example = '{}';
var obj = jQuery.parseJSON(example);
obj.AKEY //undefined
Если он undefined
, когда вы переходите к нему, это то же самое, что и ключ, даже не присутствующий. Поскольку основное предназначение JSON предназначено для передачи данных (в противном случае более строгий синтаксис объектного объекта в порядке)... лучше вообще отказаться от него.