Obsługa formatu JSON natywnego dla przeglądarki (window.JSON)

92

Widziałem odniesienia do niektórych przeglądarek natywnie obsługujących analizowanie / serializację obiektów JSON bezpiecznie i wydajnie za pośrednictwem window.JSONObject, ale trudno jest uzyskać szczegóły. Czy ktoś może wskazać właściwy kierunek? Jakie metody ujawnia ten obiekt? W jakich przeglądarkach jest obsługiwany?

levik
źródło
8
Zobacz Kiedy mogę używać analizowania JSON? aby uzyskać informacje o przeglądarkach z natywną obsługą obiektu JSON .
outis

Odpowiedzi:

108

Wszystkie nowoczesne przeglądarki obsługują natywne kodowanie / dekodowanie JSON (Internet Explorer 8+, Firefox 3.1+, Safari 4+ i Chrome 3+). Zasadniczo JSON.parse(str)przeanalizuje ciąg JSON stri zwróci obiekt oraz JSON.stringify(obj)zwróci reprezentację obiektu w formacie JSON obj.

Więcej szczegółów w artykule MDN .

Sasha Chedygov
źródło
Wiem, że wsparcie nie jest powszechne, ale użycie tej metody powinno być dużo szybsze i bezpieczniejsze niż eval () owanie łańcucha, więc chcę go używać tam, gdzie jest dostępny. Masz pomysł na wsparcie z innych przeglądarek?
levik
17
Aha, i na marginesie, NIGDY nie używaj ciągów JSON eval (). Zamiast tego użyj jednej z wielu dostępnych bibliotek analizujących JSON.
Sasha Chedygov
1
@colbeerhey: Tak, to ten, który widzę najczęściej. Możesz także ukraść pliki jQuery.
Sasha Chedygov
2
Dla porównania, kiedy powiesz "NIGDY eval () ...", a następnie wspomnisz, że json2 jest popularnie obsługiwaną biblioteką, warto zauważyć, że używa ona funkcji eval, ale najpierw próbuje sprawdzić poprawność ciągu za pomocą wyrażenia regularnego. Jest to szybsze niż sprawdzanie poprawności i analizowanie ciągu, chociaż istnieją parsery, które nie sprawdzają poprawności z porównywalną wydajnością. json2.js jest nadal prawdopodobnie najlepszym wyborem, choćby ze względu na jego wszechobecność.
TheXenocide
2
@ TheXenocide: Słuszna uwaga, ale jego autor prawdopodobnie spędził sporo czasu nad tym kodem walidacyjnym, więc mówię, że nigdy nie eval()używaj ciągów JSON, ponieważ odkryjesz koło na nowo i prawdopodobnie źle to zrobisz.
Sasha Chedygov
30

jQuery-1.7.1.js - linia 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,
lks
źródło
4
Ładny. Dobry argument za użyciem jQuery.
OneWorld
11
Bardziej jak argument, aby zajrzeć do środka jQuery =)
Olga
13

Zaletą korzystania z json2.js jest to, że zainstaluje parser tylko wtedy, gdy przeglądarka jeszcze go nie ma. Możesz zachować zgodność ze starszymi przeglądarkami, ale użyj natywnego parsera JSON (który jest bezpieczniejszy i szybszy), jeśli jest dostępny.

Przeglądarki z natywnym JSON:

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

SOL.

Gak
źródło
10

[rozszerzenie komentarza musicfreak ]

Jeśli używasz jQuery, użyj parseJSON

var obj = jQuery.parseJSON(data)

Wewnętrznie sprawdza, czy przeglądarka obsługuje .JSON.parse i (jeśli jest dostępne) wywołuje natywne okno.JSON.parse.

Jeśli nie, sam analizuje.

Michael Freidgeim
źródło
8

Z korzyścią dla każdego, kto wejdzie do tego wątku - aktualną, ostateczną listę przeglądarek obsługujących obiekt JSON znajdziesz tutaj. . Krótka ogólna odpowiedź - prawie wszystkie przeglądarki, które naprawdę mają znaczenie w roku 2013+.

DroidOS
źródło