jQuery.parseJSON против JSON.parse

79

jQuery.parseJSONи JSON.parseдве функции, которые выполняют одну и ту же задачу. Если библиотека jQuery уже загружена, будет ли использование jQuery.parseJSONлучше, чем использование JSON.parse, с точки зрения производительности?

Если да, то почему? Если нет, то почему?

Вопрос переполнен
источник
1
Я думаю, что JSON.parse недоступен в старых браузерах. С точки зрения скорости они должны быть идентичными, JSON.parse должен быть немного быстрее (я думаю, что jQuery использует JSON.parse в новых браузерах).

Ответы:

112

Вот выдержка из jQuery 1.9.1 :

parseJSON: function( data ) {
    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

    if ( data === null ) {
        return data;
    }

    if ( typeof data === "string" ) {

        // Make sure leading/trailing whitespace is removed (IE can't handle it)
        data = jQuery.trim( data );

        if ( 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 ) )();
            }
        }
    }

    jQuery.error( "Invalid JSON: " + data );
},

Как видите, jQuery будет использовать собственный JSON.parseметод, если он доступен, а в противном случае он попытается оценить данные с помощью new Function, что вроде как eval.

Так что да, вам обязательно стоит использовать jQuery.parseJSON.

dfsq
источник
3
Вау, отличные ответы! Спасибо всем, я думаю, ваш ответ является наиболее полным.
Вопрос Overflow
В зависимости от того, откуда взялся ваш json, могут возникнуть проблемы с безопасностью с резервным методом eval.
Стив Мэйн
Материал rvalidchars.test должен отлавливать недопустимый JSON; так что это выглядит довольно безопасно.
Daniel
6
Обратите внимание, что это устарело, и пустая строка больше не будет возвращать null. Вместо этого он выдаст ошибку.
mlissner
3
Да, я думаю, что этот ответ следует обновить, чтобы указать, что для этого почти не нужно использовать большую библиотеку, такую ​​как jQuery. Собираюсь сообщить о ссылке Джозефа Мечтателя, чтобы показать принятие браузером JSON.parse: caniuse.com/#search=json
Hulvej
10

Согласно jQuery

Если браузер предоставляет встроенную реализацию JSON.parse, jQuery использует ее для анализа строки.

таким образом, это означает, что jQuery предоставляет парсер JSON, если в браузере нет собственной реализации. вот сравнительная таблица браузеров, у которых есть (и нет) функциональность JSON

Джозеф
источник
6

JSON.parse () изначально доступен в некоторых браузерах, но не в других, поэтому безопаснее использовать библиотеку. Как отметили другие респонденты, реализация JQuery работает хорошо. Также существует библиотека JSON Дугласа Крокфорда , которая использует встроенную реализацию, если она доступна.

У библиотеки JSON есть преимущество, заключающееся в том, что в ней есть метод преобразования объекта JavaScript в строку JSON, которая в данный момент отсутствует в jQuery.

Leifbennett
источник
Лучший ответ, потому что он указывает, почему все еще необходима библиотека JSON Дугласа Крокфорда.
Натан Мойнвазири
6

Если вы используете jQuery версии 3 (выпущенной в 2016 году), вам следует использовать, JSON.parse()потому jQuery.parseJSON() что она устарела .

Начиная с jQuery 3.0, $ .parseJSON устарел. Для анализа объектов JSON используйте вместо этого собственный метод JSON.parse.

Хурам Хан
источник
3

Я не знаю о производительности, но определенно безопаснее использовать метод jQuery, потому что некоторые браузеры, такие как ie7 и ниже, могут не иметь встроенных функций JSON.
Все дело в совместимости, точно так же, как вы используете каждый метод jQuery вместо собственного forEachметода массива для итерации.

gion_13
источник
Я всегда использую JSON.parse (date), потому что я никогда не поддерживаю IE8- и меньше символов, чем $ .parseJSON () ^ _ ^ Для IE8 - давайте использовать вот так <! - [if lt IE 8]> <meta http- Equiv = "Обновить" content = "0; url = / error-browser.html"> <! [endif] ->
xicooc
2

Что касается производительности , то наиболее актуальный ответ - JSON.parse.

Собственный объект JSON в настоящее время поддерживается в каждом браузере , поэтому сделайте выбор JSON.parse. Вы можете увидеть таблицу поддержки здесь: http://caniuse.com/#feat=json

Вы также можете найти этот псевдоним в репозитории JQuery на GitHub: https://github.com/jquery/jquery/search?utf8=%E2%9C%93&q=parseJSON

Кроме того , jQuery.parseJsonбыл устаревшим по версии 3.0+ , как говорили другие ответы здесь.

Вы должны использовать версию jQuery только в том случае, если вы используете старую версию JQuery + если вы хотите обеспечить поддержку очень старых браузеров (обычно не рекомендуется ).

Джованнипды
источник
1

jQuery используется JSON.parseдля внутреннего анализа файла JSON, поэтому в большинстве случаев это не имеет никакого значения.

Но некоторые из старых браузеров не поддерживают JSON.parseфункциональность. В этом случае использование jQuery.parseJSONполезно, поскольку jQuery может обрабатывать JSON с помощью своей собственной функции.

ЗАМЕТКА:

jQuery.parseJSONустарел с jQuery 3.0, поэтому используйте собственный JSON.parseметод.

Шива Пракаш
источник