Prise en charge JSON native du navigateur (window.JSON)

92

J'ai vu des références à certains navigateurs prenant en charge nativement l'analyse / la sérialisation JSON d'objets en toute sécurité et efficacement via window.JSONObject, mais les détails sont difficiles à trouver. Quelqu'un peut-il indiquer la bonne direction? Quelles sont les méthodes exposées par cet objet? Sous quels navigateurs est-il pris en charge?

Levik
la source
8
Consultez Quand puis-je utiliser l'analyse JSON? pour plus d'informations sur les navigateurs avec prise en charge native de l' objet JSON .
sortie

Réponses:

108

Tous les navigateurs modernes prennent en charge le codage / décodage JSON natif (Internet Explorer 8+, Firefox 3.1+, Safari 4+ et Chrome 3+). Fondamentalement, JSON.parse(str)analysera la chaîne JSON stret retournera un objet, et JSON.stringify(obj)retournera la représentation JSON de l'objet obj.

Plus de détails sur l' article MDN .

Sasha Chedygov
la source
Je sais que le support n'est pas répandu, mais utiliser cette méthode devrait être beaucoup plus rapide et plus sûr que eval () ing une chaîne, donc je veux l'utiliser là où elle est disponible. Une idée sur le support d'autres navigateurs?
levik
17
Oh, et sur une note latérale, JAMAIS les chaînes JSON eval (). Utilisez plutôt l'une des nombreuses bibliothèques d'analyse JSON disponibles.
Sasha Chedygov
1
@colbeerhey: Ouais, c'est celui que je vois le plus souvent. Vous pouvez également voler des fichiers jQuery.
Sasha Chedygov
2
Pour référence, lorsque vous dites "JAMAIS eval () ..." et que vous mentionnez ensuite que json2 est la bibliothèque couramment prise en charge, il convient de noter qu'elle utilise eval, mais qu'elle tente d'abord de valider la chaîne en utilisant regex. C'est plus rapide que la validation et l'analyse de la chaîne, bien qu'il existe des analyseurs qui ne valident pas avec des performances comparables. json2.js reste probablement le meilleur choix, ne serait-ce que pour son omniprésence.
TheXenocide
2
@TheXenocide: Bon point, mais son auteur a probablement passé une bonne partie de son temps sur ce code de validation, donc je dis jamais de eval()chaînes JSON car vous réinventerez la roue et vous vous tromperez probablement.
Sasha Chedygov
30

jQuery-1.7.1.js - 555 ligne ...

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
la source
4
Agréable. Bon argument pour utiliser jQuery.
OneWorld
11
Plus comme un argument pour regarder à l'intérieur de jQuery =)
Olga
13

L'avantage d'utiliser json2.js est qu'il installera un analyseur uniquement si le navigateur n'en possède pas déjà un. Vous pouvez maintenir la compatibilité avec les navigateurs plus anciens, mais utilisez l'analyseur JSON natif (qui est plus sécurisé et plus rapide) s'il est disponible.

Navigateurs avec JSON natif:

  • IE8 +
  • Firefox 3.1+
  • Safari 4.0.3 ou version ultérieure
  • Opera 10.5+

G.

Gak
la source
10

[extension du commentaire musicfreak ]

Si vous utilisez jQuery, utilisez parseJSON

var obj = jQuery.parseJSON(data)

En interne, il vérifie si le navigateur prend en charge .JSON.parse et (si disponible) appelle window.JSON.parse natif.

Sinon, s'analyse lui-même.

Michael Freidgeim
la source
8

Pour le bénéfice de tous ceux qui rencontrent ce fil de discussion - pour une liste définitive et à jour des navigateurs prenant en charge l'objet JSON, regardez ici. . Une brève réponse générique - à peu près tous les navigateurs qui comptent vraiment pour l'année 2013+.

DroidOS
la source