jQuery.parseJSON vs JSON.parse

79

jQuery.parseJSONi JSON.parseto dwie funkcje, które wykonują to samo zadanie. Jeśli biblioteka jQuery jest już załadowana, czy używanie jQuery.parseJSONbyłoby lepsze JSON.parsepod względem wydajności niż używanie ?

Jeśli tak, dlaczego? Jeśli nie, dlaczego nie?

Przepełnienie pytań
źródło
1
Myślę, że JSON.parse nie jest dostępny w starszych przeglądarkach. Pod względem szybkości powinny być identyczne, JSON.parse powinno być trochę szybsze (myślę, że jQuery używa JSON.parse w nowszych przeglądarkach).

Odpowiedzi:

112

Oto fragment z 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 );
},

Jak widać, jQuery użyje JSON.parsemetody natywnej , jeśli jest dostępna, aw przeciwnym razie spróbuje oszacować dane new Function, co jest trochę podobne eval.

Więc tak, zdecydowanie powinieneś użyć jQuery.parseJSON.

dfsq
źródło
3
Wow, świetne odpowiedzi! Dziękuję wszystkim, myślę, że twoja odpowiedź jest najbardziej wyczerpująca.
Przepełnienie pytania
W zależności od tego, skąd pochodzi Twój plik json, mogą wystąpić problemy z bezpieczeństwem w przypadku zastępczej metody „eval”.
Steve Mayne
Materiał rvalidchars.test powinien wychwytywać nieprawidłowy kod JSON; więc wygląda to całkiem bezpiecznie.
Daniel
6
Zauważ, że to jest stare i pusty ciąg nie będzie już zwracał wartości null. Zamiast tego zgłosi błąd.
mlissner
3
Tak, myślę, że ta odpowiedź powinna zostać zaktualizowana, aby stwierdzić, że prawie niepotrzebne jest do tego używanie dużej biblioteki, takiej jak jQuery. Zamierzam zgłosić link Josepha the Dreamera, aby pokazać adopcję przeglądarki JSON.parse: caniuse.com/#search=json
Hulvej
10

Według jQuery

Tam, gdzie przeglądarka udostępnia natywną implementację JSON.parse, jQuery używa jej do analizowania ciągu.

oznacza to zatem, że jQuery zapewnia parser JSON, jeśli w przeglądarce nie ma natywnej implementacji. Oto tabela porównawcza przeglądarek, które mają (i nie mają) funkcjonalności JSON

Józef
źródło
6

JSON.parse () jest natywnie dostępna w niektórych przeglądarkach, a nie w innych, więc bezpieczniej jest korzystać z biblioteki. Implementacja JQuery działa dobrze, jak zauważyli inni respondenci. Istnieje również biblioteka JSON Douglasa Crockforda , która używa natywnej implementacji, jeśli jest dostępna.

Biblioteka JSON ma tę zaletę, że ma metodę przekształcania obiektu JavaScript w ciąg JSON, którego obecnie brakuje w jQuery.

leifbennett
źródło
Najlepsza odpowiedź, ponieważ wskazuje, dlaczego biblioteka JSON autorstwa Douglasa Crockforda jest nadal potrzebna.
Nathan Moinvaziri,
6

Jeśli używasz jQuery w wersji 3 (wydanej w 2016 r.), Powinieneś użyć, JSON.parse()ponieważ jQuery.parseJSON() została wycofana .

Począwszy od jQuery 3.0, $ .parseJSON jest przestarzałe. Aby przeanalizować obiekty JSON, użyj zamiast tego natywnej metody JSON.parse.

Khuram Khan
źródło
3

Nie wiem o wydajności, ale zdecydowanie bezpieczniej jest używać metody jQuery, ponieważ niektóre przeglądarki, takie jak ie7 i starsze, mogą nie mieć natywnie żadnych funkcji JSON.
Chodzi o kompatybilność, tak jak używasz każdej metody jQuery zamiast natywnej forEachmetody tablicy do iteracji.

gion_13
źródło
Zawsze używam JSON.parse (data), ponieważ nigdy nie obsługuję IE8- i mniej znaków niż $ .parseJSON () ^ _ ^ Dla IE8 - używajmy w ten sposób <! - [if lt IE 8]> <meta http- equiv = "Refresh" content = "0; url = / error-browser.html"> <! [endif] ->
xicooc
2

Mówiąc o wydajności , najbardziej aktualną odpowiedzią jestJSON.parse .

Natywny obiekt JSON jest obecnie obsługiwany w każdej przeglądarce , więc zdecyduj się na JSON.parse. Możesz zobaczyć tabelę wsparcia tutaj: http://caniuse.com/#feat=json

Możesz również wyszukać występowanie tego aliasu w repozytorium JQuery na GitHub: https://github.com/jquery/jquery/search?utf8=%E2%9C%93&q=parseJSON

Ponadto jQuery.parseJsonzostał wycofany w wersji 3.0+, jak wspomniano w innych odpowiedziach tutaj.

Powinieneś używać tylko wersji jQuery, jeśli jesteś starą wersją JQuery +, jeśli chcesz zapewnić obsługę bardzo starych przeglądarek (zwykle nie jest to zalecane ).

giovannipds
źródło
1

jQuery używa wewnętrznie JSON.parsedo analizowania pliku JSON, więc w większości przypadków nie robi to żadnej różnicy.

Jednak niektóre starsze przeglądarki nie obsługują JSON.parsefunkcjijQuery.parseJSON jest korzystne, ponieważ jQuery może obsługiwać JSON za pomocą własnej funkcji.

UWAGA:

jQuery.parseJSONjest przestarzała z wersji jQuery 3.0, więc użyj JSON.parsemetody natywnej .

Siva Prakash
źródło