2010-07-24 22 views
56

Tengo que utilizar:¿JSON.stringify() es compatible con IE 8?

JSON.stringify() 

que debe ser apoyado por Chrome, Safari y Firefox. Creo que IE8 también tiene soporte para el objeto JSON. Creo que Internet Explorer 7 y 6 no lo hacen, por lo que estoy haciendo esto:

<!--[if lt IE 8]> 
    <script src="http://www.json.org/json2.js"></script> 
<![endif]--> 

tanto, creo que esto va a importar el JavaScript externo solamente si IE6 & 7. Miré la URL donde se encuentra alojado el guión, que se incluyen solo si la versión de IE es menor que 9:

http://code.google.com/p/html5shiv/ 
<!--[if lt IE 9]> 
    <script src="http://www.json.org/json2.js"></script> 
<![endif]--> 

, entonces ¿debería incluir esto también para IE 8?

+14

json.org/json2.js, como se le prometió en el código fuente, es un grande y gordo 404. Es posible que desee utilizar esta cdn si no se puede acoger a sí mismo json2.js : http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js – tjp

+3

@ user246114 - ¿Puedes marcar una respuesta como correcta? Gracias. – Lee

+0

Para los necesitados, el archivo fuente ahora se encuentra aquí: https: //raw.githubusercontent.com/douglascrockford/JSON-js/master/json2.js – hussfelt

Respuesta

3

A shiv just createElement son los elementos HTML5. No tiene nada que ver con JSON. Intenta obtener un analizador JSON real como json2.js de Crockford.

+0

Acepto que el analizador json es la mejor opción. –

+1

Ok, el uso anterior es correcto entonces, apunté al archivo JS correcto, creo, pero ¿es necesario para IE8? ¿O necesita ser incluido solo para IE6 e IE7? Gracias – user246114

65

Para responder a la pregunta en el título directamente, sí IE8 admite JSON.stringify() de forma nativa.

IE8 es la primera versión de IE para conseguir este apoyo, y la funcionalidad se explica en detalle por el equipo de desarrollo aquí: http://blogs.msdn.com/b/ie/archive/2008/09/10/native-json-in-ie8.aspx

La respuesta a la segunda parte de la pregunta, sí que tendría que incluir funcionalidad alternativa para IE6/IE7. Algo como Modernizr puede hacer que sea fácil verificar esto.

También tenga en cuenta si el usuario está en la Vista de compatibilidad en IE8, el objeto JSON no estará disponible.

+0

esta es la respuesta correcta, pero de manera más general, recomendaría consultar [YepNopeJS] (http://yepnopejs.com/) o [Modernizr] (http://www.modernizr.com/) para realizar el control de cargando condicionalmente la biblioteca json. –

+11

También tenga en cuenta si el usuario está en la Vista de compatibilidad, el objeto JSON no estará disponible. – Dave

+0

Gracias @nickk_can y Dave, lo he actualizado en base a sus comentarios. – Lee

31

Si prueba JSON.stringify() usando IE 8, debe asegurarse de que no esté funcionando en modo compatibilidad. Ver JSON object undefined in Internet Explorer 8

Usted tendrá que añadir

<meta http-equiv="X-UA-Compatible" content="IE=8" /> 

a su página

9

No es necesario utilizar los condicionales para determinar si se debe incluir o no json2.js. Tome un vistazo al código fuente:

var JSON; 
if (!JSON) { 
    JSON = {}; 
} 

if (typeof JSON.stringify !== 'function') { 
    JSON.stringify = function (value, replacer, space) { 
     // Code 
    } 
} 

if (typeof JSON.parse !== 'function') { 
    JSON.parse = function (text, reviver) { 
     // Code 
    } 
} 

Lo que esto hace es primera comprobación para ver si JSON ya existe como un objeto. Si no, entonces crea un nuevo objeto para albergar las funciones JSON. Luego, comprueba si existe una implementación nativa de .stringify() o .parse(). Si no, entonces crea esas funciones.

En pocas palabras: si existe una implementación nativa, incluyendo json2.js, no sobrescribirá la implementación nativa. De lo contrario, agregará esa funcionalidad, por lo que no es necesario que use condicionales, a menos que intente minimizar las solicitudes.

(También cabe señalar que IE10 no soporta las sentencias condicionales, así que recomiendo en contra de confiar en ellos a menos que no hay ninguna alternativa.)

+2

Por supuesto, es posible que no desee la solicitud adicional en los casos en que no esté enrollada con algún tipo de paquete de activos. – gtd

+0

Si _IE10 no admite instrucciones condicionales_ ¿no verá esas líneas publicadas por el OP como solo un comentario? ¿Qué me estoy perdiendo? –

+0

@ClodoaldoNeto Sí, es cierto. Pero, en general, las personas han estado confiando en declaraciones condicionales para explicar las variaciones en la implementación de estándares de Internet Explorer. IE10 y superior ya no admiten condicionales, por lo que el comentario se relacionó con el uso de condicionales por parte del OP. Mi respuesta es que, json2.js, condicionales no son necesarios, ya que no sobrescribirá los métodos nativos, con la advertencia de que los desarrolladores deben comenzar a alejarse de los condicionales de Internet Explorer para futuras versiones. – saluce

16

Hay una solución mejor. ..

Esto no responde directamente a su pregunta, sino que proporciona una solución completa a su problema.

La biblioteca jquery-json proporciona un envoltorio que utiliza la implementación del objeto JSON nativo si está disponible y cae de nuevo a su propia implementación JSON si no lo es. Lo que significa que funcionará en cualquier navegador.

Aquí está el uso Ejemplo de la página web del proyecto:

var thing = {plugin: 'jquery-json', version: 2.3}; 

var encoded = $.toJSON(thing); 
// '{"plugin":"jquery-json","version":2.3}' 
var name = $.evalJSON(encoded).plugin; 
// "jquery-json" 
var version = $.evalJSON(encoded).version; 
// 2.3 

El uso es muy sencillo: toJSON stringifies la fuente de JS; evalJSON convierte los datos de cadena JSON a objetos JavaScript.

Si miras la fuente, la implementación es sorprendentemente simple pero funciona muy bien. Lo he usado personalmente en algunos proyectos.

No hay necesidad de hacer la detección del navegador si funciona en todos los navegadores.

+0

No estoy seguro de para qué sirve el downvote. Esto no es más que un polyfill de JS para compatibilidad con JSON que recae en JSON.stringify si el navegador lo admite. –

+0

retiro mi comentario.Mencioné que ya tenemos una biblioteca. – naveen

+0

Sí, no me di cuenta antes de agregar mi respuesta. TIL, supongo. –

8

ponga el siguiente código en su archivo js;

var JSON = JSON || {}; 

// implement JSON.stringify serialization 
JSON.stringify = JSON.stringify || function (obj) { 

var t = typeof (obj); 
if (t != "object" || obj === null) { 

    // simple data type 
    if (t == "string") obj = '"'+obj+'"'; 
    return String(obj); 

} 
else { 

    // recurse array or object 
    var n, v, json = [], arr = (obj && obj.constructor == Array); 

    for (n in obj) { 
     v = obj[n]; t = typeof(v); 

     if (t == "string") v = '"'+v+'"'; 
     else if (t == "object" && v !== null) v = JSON.stringify(v); 

     json.push((arr ? "" : '"' + n + '":') + String(v)); 
    } 

    return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); 
} 
}; 

// implement JSON.parse de-serialization 
JSON.parse = JSON.parse || function (str) { 
if (str === "") str = '""'; 
eval("var p=" + str + ";"); 
return p; 
}; 
1

Solo para hacer un seguimiento Mozilla ha realizado un polyfill para el objeto JSON si necesita que funcione en modo de compatibilidad con IE.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON

if (!window.JSON) { 
    window.JSON = { 
    parse: function(sJSON) { return eval('(' + sJSON + ')'); }, 
    stringify: (function() { 
     var toString = Object.prototype.toString; 
     var isArray = Array.isArray || function (a) { return toString.call(a) === '[object Array]'; }; 
     var escMap = {'"': '\\"', '\\': '\\\\', '\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t'}; 
     var escFunc = function (m) { return escMap[m] || '\\u' + (m.charCodeAt(0) + 0x10000).toString(16).substr(1); }; 
     var escRE = /[\\"\u0000-\u001F\u2028\u2029]/g; 
     return function stringify(value) { 
     if (value == null) { 
      return 'null'; 
     } else if (typeof value === 'number') { 
      return isFinite(value) ? value.toString() : 'null'; 
     } else if (typeof value === 'boolean') { 
      return value.toString(); 
     } else if (typeof value === 'object') { 
      if (typeof value.toJSON === 'function') { 
      return stringify(value.toJSON()); 
      } else if (isArray(value)) { 
      var res = '['; 
      for (var i = 0; i < value.length; i++) 
       res += (i ? ', ' : '') + stringify(value[i]); 
      return res + ']'; 
      } else if (toString.call(value) === '[object Object]') { 
      var tmp = []; 
      for (var k in value) { 
      if (value.hasOwnProperty(k)) 
       tmp.push(stringify(k) + ': ' + stringify(value[k])); 
      } 
      return '{' + tmp.join(', ') + '}'; 
      } 
     } 
     return '"' + value.toString().replace(escRE, escFunc) + '"'; 
     }; 
    })() 
    }; 
}