jQuery.parseJSON frente a JSON.parse

79

jQuery.parseJSONy JSON.parseson dos funciones que realizan la misma tarea. Si la biblioteca jQuery ya está cargada, ¿ jQuery.parseJSONsería mejor usar que usar JSON.parse, en términos de rendimiento?

¿Si es así por qué? Si no, ¿por qué no?

Desbordamiento de preguntas
fuente
1
Creo que JSON.parse no está disponible en navegadores antiguos. En términos de velocidad, deberían ser idénticos, JSON.parse debería ser un poco más rápido (creo que jQuery usa JSON.parse en los navegadores más nuevos).

Respuestas:

112

Aquí hay un extracto de 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 );
},

Como puede ver, jQuery usará el JSON.parsemétodo nativo si está disponible, y de lo contrario, intentará evaluar los datos con new Function, que es algo así como eval.

Entonces sí, definitivamente deberías usar jQuery.parseJSON.

dfsq
fuente
3
¡Vaya, buenas respuestas! Gracias a todos, creo que la tuya es la respuesta más completa.
Question Overflow
Dependiendo de dónde provenga su json, puede haber problemas de seguridad con el método alternativo 'eval'.
Steve Mayne
El material rvalidchars.test debería detectar JSON inválido; entonces esto parece bastante seguro.
Daniel
6
Tenga en cuenta que esto es antiguo y una cadena vacía ya no devolverá nulo. En su lugar, arrojará un error.
mlissner
3
Sí, creo que esta respuesta debería actualizarse para indicar que es casi innecesario usar una biblioteca grande como jQuery para esto. Voy a informar el enlace de Joseph the Dreamer para mostrar la adopción del navegador de JSON.parse: caniuse.com/#search=json
Hulvej
10

Según jQuery

Cuando el navegador proporciona una implementación nativa de JSON.parse, jQuery lo usa para analizar la cadena.

por lo tanto, significa que jQuery proporciona un analizador JSON si no existe una implementación nativa en el navegador. aquí hay una tabla de comparación de navegadores que tienen (y no tienen) funcionalidad JSON

José
fuente
6

JSON.parse () está disponible de forma nativa en algunos navegadores, no en otros, por lo que es más seguro usar una biblioteca. La implementación de JQuery funciona bien, como han señalado otros encuestados. También está la biblioteca JSON de Douglas Crockford , que usa la implementación nativa si está disponible.

La biblioteca JSON tiene la ventaja de que tiene un método para convertir un objeto JavaScript en una cadena JSON, que falta en jQuery en este momento.

Leifbennett
fuente
La mejor respuesta porque indica por qué la biblioteca JSON de Douglas Crockford sigue siendo necesaria.
Nathan Moinvaziri
6

Si está utilizando la versión 3 de jQuery (lanzada en 2016), debería utilizarla JSON.parse()porque jQuery.parseJSON() ha quedado obsoleta .

A partir de jQuery 3.0, $ .parseJSON está en desuso. Para analizar objetos JSON, utilice el método JSON.parse nativo en su lugar.

Khuram Khan
fuente
3

No sé sobre el rendimiento, pero definitivamente es más seguro usar el método jQuery porque algunos navegadores como ie7 y versiones inferiores pueden no tener ninguna funcionalidad JSON de forma nativa.
Se trata de compatibilidad, al igual que usa cada método de jQuery en lugar del forEachmétodo nativo de la matriz para la iteración.

gion_13
fuente
Siempre uso JSON.parse (fecha) porque nunca soporto IE8- y menos caracteres que $ .parseJSON () ^ _ ^ Para IE8- usemos así <! - [if lt IE 8]> <meta http- equiv = "Refresh" content = "0; url = / error-browser.html"> <! [endif] ->
xicooc
2

Hablando de rendimiento , la respuesta más actualizada es JSON.parse.

El objeto JSON nativo es compatible con todos los navegadores hoy en día, así que opte por JSON.parse. Puede ver la tabla de soporte aquí: http://caniuse.com/#feat=json

También puede buscar estas apariciones de alias en el repositorio de JQuery en GitHub: https://github.com/jquery/jquery/search?utf8=%E2%9C%93&q=parseJSON

Además, jQuery.parseJsonquedó obsoleto en la versión 3.0+ como se menciona en otras respuestas aquí.

Solo debe usar la versión de jQuery si tiene una versión antigua de JQuery + si desea brindar soporte para navegadores muy antiguos (normalmente, no se recomienda ).

giovannipds
fuente
1

jQuery utiliza internamente JSON.parsepara analizar el archivo JSON, por lo que no hace ninguna diferencia en la mayoría de los casos.

Pero algunos de los navegadores más antiguos no admiten la JSON.parsefuncionalidad, en ese caso, el uso jQuery.parseJSONes beneficioso ya que jQuery puede manejar JSON usando su propia función.

NOTA:

jQuery.parseJSONestá en desuso de jQuery 3.0. Por lo tanto, utilice el JSON.parsemétodo nativo .

Siva Prakash
fuente