Compatibilidad con JSON nativo del navegador (window.JSON)

92

He visto referencias a algunos navegadores que admiten de forma nativa el análisis / serialización JSON de objetos de forma segura y eficiente a través del window.JSONObjeto, pero los detalles son difíciles de conseguir. ¿Alguien puede apuntar en la dirección correcta? ¿Cuáles son los métodos que expone este objeto? ¿Con qué navegadores es compatible?

levik
fuente
8
Consulte ¿ Cuándo puedo usar el análisis JSON? para obtener información sobre los navegadores con soporte nativo para el objeto JSON .
sale el

Respuestas:

108

Todos los navegadores modernos admiten la codificación / decodificación JSON nativa (Internet Explorer 8+, Firefox 3.1+, Safari 4+ y Chrome 3+). Básicamente, JSON.parse(str)analizará la cadena JSON stry devolverá un objeto, y JSON.stringify(obj)devolverá la representación JSON del objeto obj.

Más detalles sobre el artículo de MDN .

Sasha Chedygov
fuente
Sé que el soporte no está muy extendido, pero usar este método debería ser mucho más rápido y seguro que evaluar () una cadena, así que quiero usarlo donde esté disponible. ¿Alguna idea sobre el soporte de otros navegadores?
levik
17
Ah, y en una nota al margen, NUNCA eval () cadenas JSON. En su lugar, use una de las muchas bibliotecas de análisis JSON disponibles.
Sasha Chedygov
1
@colbeerhey: Sí, ese es el que veo con más frecuencia. También podría robar jQuery's.
Sasha Chedygov
2
Como referencia, cuando dice "NUNCA eval () ..." y luego menciona que json2 es la biblioteca con soporte popular, vale la pena señalar que usa eval, pero intenta validar la cadena usando expresiones regulares primero. Esto es más rápido que validar y analizar la cadena, aunque hay analizadores que no validan con un rendimiento comparable. json2.js sigue siendo probablemente la mejor opción, aunque solo sea por su omnipresencia.
TheXenocide
2
@TheXenocide: Buen punto, pero su autor probablemente dedicó una buena cantidad de tiempo a ese código de validación, así que digo nunca eval()cadenas JSON porque estará reinventando la rueda y probablemente se equivocará.
Sasha Chedygov
30

jQuery-1.7.1.js - 555 línea ...

parseJSON: function( data ) {
    if ( typeof data !== "string" || !data ) {
        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 ) )();

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





rvalidchars = /^[\],:{}\s]*$/,

rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,

rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,

rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
lks
fuente
4
Agradable. Buen argumento para usar jQuery.
OneWorld
11
Más como un argumento para mirar dentro de jQuery =)
Olga
13

La ventaja de usar json2.js es que solo instalará un analizador si el navegador aún no tiene uno. Puede mantener la compatibilidad con navegadores más antiguos, pero use el analizador JSON nativo (que es más seguro y rápido) si está disponible.

Navegadores con JSON nativo:

  • IE8 +
  • Firefox 3.1 o superior
  • Safari 4.0.3+
  • Opera 10.5+

GRAMO.

Gak
fuente
10

[ampliando el comentario de musicfreak ]

Si está usando jQuery, use parseJSON

var obj = jQuery.parseJSON(data)

Internamente, comprueba si el navegador admite .JSON.parse y (si está disponible) llama a la ventana nativa.JSON.parse.

Si no, se analiza a sí mismo.

Michael Freidgeim
fuente
8

Para el beneficio de cualquiera que se encuentre con este hilo, para obtener una lista actualizada y definitiva de navegadores que admiten el objeto JSON, busque aquí. . Una breve respuesta genérica: prácticamente todos los navegadores que realmente importan en el año 2013+.

DroidOS
fuente