Подтвердить что ты не робот

Почему один номер действителен json?

$.parseJSON("1") возвращает 1. Я ожидаю, что это вызовет ошибку, потому что это не похоже на действительный JSON формы:

{
    "firstName": "John"
}

Почему 1 правильно разбирается? В любом случае, чтобы это могло вызвать ошибку.

4b9b3361

Ответ 1

Разбор номера

Вы можете лучше обрабатывать разбор чисел с помощью parseInt(). Он вернет номер успеха и NaN (не номер) в противном случае.

var a = parseInt('23');
isNan(a); // false

var b = parseInt('ab');
isNan(b); // true

Почему он возвращает 1 в jQuery

Если вы посмотрите на источник метода jQuery, он станет очень быстрым.

  • Он проверит, есть ли встроенная поддержка JSON.parse.
  • Если нет, он создаст анонимную функцию (со строкой строки), которая просто возвращает данные, содержащиеся в строке JSON, и вызывает ее.

Итак, если в вашем случае выполняется шаг 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 );
},

Ответ 2

Хотя 1 не является допустимым объектом JSON, это действительный номер JSON. Кажется, что $.parseJSON анализирует все значения JSON, а не только объекты.

Ответ 3

parseJSON фактически просто возвращает объект javascript из хорошо сформированной строки json. Формат json принимает больше, чем просто (ассоциативные) массивы. Он принимает структуры данных, такие как:

  • Объекты
  • Массивы
  • Значения
  • Строки
  • Числа

Посмотрите http://json.org/ для всех деталей, касающихся json.

$. parseJSON ( "1" ) фактически считывает действительный номер javascript 1, в результате получается 1

Ответ 4

1 не является допустимым "текстом JSON", но большинство парсеров JSON принимают его в любом случае. Не все делают, как вы нашли с jsonlint.

Я отправил более полное объяснение с информацией из RFC JSON вместе с мнением Дугласа Крокфорда в ответ на другой вопрос.