Supporto JSON nativo del browser (window.JSON)


92

Ho visto riferimenti ad alcuni browser che supportano nativamente l'analisi / serializzazione JSON di oggetti in modo sicuro ed efficiente tramite l' window.JSONoggetto, ma i dettagli sono difficili da ottenere. Qualcuno può indicare la giusta direzione? Quali sono i metodi esposti da questo oggetto? Con quali browser è supportato?


8
Vedi Quando posso usare l'analisi JSON? per informazioni sui browser con supporto nativo per l' oggetto JSON .
outis

Risposte:


108

Tutti i browser moderni supportano la codifica / decodifica JSON nativa (Internet Explorer 8+, Firefox 3.1+, Safari 4+ e Chrome 3+). Fondamentalmente, JSON.parse(str)analizzerà la stringa JSON stre restituirà un oggetto e JSON.stringify(obj)restituirà la rappresentazione JSON dell'oggetto obj.

Maggiori dettagli sul articolo MDN .


So che il supporto non è molto diffuso, ma l'uso di questo metodo dovrebbe essere molto più veloce e sicuro di eval () ing una stringa, quindi voglio usarlo dove è disponibile. Qualche idea sul supporto da altri browser?
levik

17
Oh, e in una nota a margine, MAI eval () stringhe JSON. Utilizza invece una delle tante librerie di analisi JSON disponibili.
Sasha Chedygov

1
@colbeerhey: Sì, è quello che vedo più spesso. Potresti anche rubare i file jQuery.
Sasha Chedygov

2
Per riferimento, quando dici "MAI eval () ..." e poi dici che json2 è la libreria comunemente supportata, vale la pena notare che usa eval, ma tenta di convalidare la stringa usando prima regex. È più veloce della convalida e dell'analisi della stringa, anche se esistono parser che non convalidano con prestazioni comparabili. json2.js è ancora probabilmente la scelta migliore, se non altro per la sua pervasività.
TheXenocide

2
@TheXenocide: Buon punto, ma il suo autore probabilmente ha speso un bel po 'di tempo su quel codice di convalida, quindi dico mai eval()stringhe JSON perché reinventerai la ruota e probabilmente sbaglierai.
Sasha Chedygov

30

jQuery-1.7.1.js - riga 555 ...

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,

4
Bello. Buon argomento per usare jQuery.
OneWorld

11
Più come un argomento per guardare dentro jQuery =)
Olga

13

Il vantaggio dell'utilizzo di json2.js è che installerà un parser solo se il browser non ne ha già uno. È possibile mantenere la compatibilità con i browser meno recenti, ma utilizzare il parser JSON nativo (che è più sicuro e veloce) se disponibile.

Browser con JSON nativo:

  • IE8 +
  • Firefox 3.1 e versioni successive
  • Safari 4.0.3 e versioni successive
  • Opera 10.5+

G.


10

[estensione del commento musicfreak ]

Se stai usando jQuery, usa parseJSON

var obj = jQuery.parseJSON(data)

Internamente controlla se il browser supporta .JSON.parse e (se disponibile) chiama window.JSON.parse nativo.

In caso contrario, analizza se stesso.


8

A vantaggio di chiunque si imbatta in questo thread: per un elenco aggiornato e definitivo di browser che supportano l'oggetto JSON, guarda qui. . Una breve risposta generica: praticamente tutti i browser che contano davvero nell'anno 2013+.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.