$.parseJSON("1")
возвращает 1
. Я ожидаю, что это вызовет ошибку, потому что это не похоже на действительный JSON формы:
{
"firstName": "John"
}
Почему 1
правильно разбирается? В любом случае, чтобы это могло вызвать ошибку.
$.parseJSON("1")
возвращает 1
. Я ожидаю, что это вызовет ошибку, потому что это не похоже на действительный JSON формы:
{
"firstName": "John"
}
Почему 1
правильно разбирается? В любом случае, чтобы это могло вызвать ошибку.
Вы можете лучше обрабатывать разбор чисел с помощью parseInt()
. Он вернет номер успеха и NaN
(не номер) в противном случае.
var a = parseInt('23');
isNan(a); // false
var b = parseInt('ab');
isNan(b); // true
Если вы посмотрите на источник метода jQuery, он станет очень быстрым.
Итак, если в вашем случае выполняется шаг 2.
, он просто вернет 1
, хотя это не настоящий JSON.
UPDATE:
Мне было любопытно, как бы обработал нативный JSON.parse
, и он делает то же самое (возвращая 1
). Поэтому независимо от реализации вы всегда получаете одинаковый результат.
Библиотека на дисплее: http://code.jquery.com/jquery-1.8.3.js
parseJSON: function( data ) {
if ( !data || typeof data !== "string") {
return null;
}
// Make sure leading/trailing whitespace is removed (IE can't handle it)
data = jQuery.trim( data );
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
if ( rvalidchars.test( data.replace( rvalidescape, "@" )
.replace( rvalidtokens, "]" )
.replace( rvalidbraces, "")) ) {
return ( new Function( "return " + data ) )(); // Just returns JSON data.
}
jQuery.error( "Invalid JSON: " + data );
},
Хотя 1
не является допустимым объектом JSON, это действительный номер JSON. Кажется, что $.parseJSON
анализирует все значения JSON, а не только объекты.
parseJSON фактически просто возвращает объект javascript из хорошо сформированной строки json. Формат json принимает больше, чем просто (ассоциативные) массивы. Он принимает структуры данных, такие как:
Посмотрите http://json.org/ для всех деталей, касающихся json.
$. parseJSON ( "1" ) фактически считывает действительный номер javascript 1, в результате получается 1
1
не является допустимым "текстом JSON", но большинство парсеров JSON принимают его в любом случае. Не все делают, как вы нашли с jsonlint.
Я отправил более полное объяснение с информацией из RFC JSON вместе с мнением Дугласа Крокфорда в ответ на другой вопрос.