Dukungan JSON asli browser (window.JSON)

92

Saya telah melihat referensi ke beberapa browser yang secara native mendukung parsing / serialisasi objek JSON dengan aman dan efisien melalui window.JSONObject, tetapi detailnya sulit didapat. Adakah yang bisa menunjuk ke arah yang benar? Apa metode yang diekspos Objek ini? Browser apa yang didukungnya?

levik
sumber
8
Lihat Kapan saya dapat menggunakan penguraian JSON? untuk info tentang browser dengan dukungan asli untuk objek JSON .
outis

Jawaban:

108

Semua browser modern mendukung encoding / decoding JSON asli (Internet Explorer 8+, Firefox 3.1+, Safari 4+, dan Chrome 3+). Pada dasarnya, JSON.parse(str)akan mengurai string JSON strdan mengembalikan objek, dan JSON.stringify(obj)akan mengembalikan representasi JSON dari objek tersebut obj.

Rincian lebih lanjut tentang artikel MDN .

Sasha Chedygov
sumber
Saya tahu dukungannya tidak tersebar luas, tetapi menggunakan metode ini seharusnya jauh lebih cepat dan lebih aman daripada mengevaluasi string, jadi saya ingin menggunakannya jika tersedia. Ada ide tentang dukungan dari browser lain?
levik
17
Oh, dan di samping catatan, JANGAN PERNAH eval () string JSON. Sebagai gantinya, gunakan salah satu dari banyak pustaka penguraian JSON yang tersedia.
Sasha Chedygov
1
@ Colbeerhey: Ya, itulah yang paling sering saya lihat. Anda juga bisa mencuri jQuery.
Sasha Chedygov
2
Sebagai referensi, ketika Anda mengatakan "NEVER eval () ..." dan kemudian menyebutkan bahwa json2 adalah pustaka yang didukung secara populer, perlu dicatat bahwa ia menggunakan eval, tetapi mencoba memvalidasi string menggunakan regex terlebih dahulu. Ini lebih cepat daripada memvalidasi dan mengurai string, meskipun ada parser yang tidak memvalidasi dengan performa yang sebanding. json2.js mungkin masih merupakan pilihan terbaik, jika hanya karena sifatnya yang menyebar.
TheXenocide
2
@TheXenocide: Poin bagus, tetapi penulisnya mungkin menghabiskan banyak waktu untuk kode validasi itu, jadi saya katakan jangan pernah eval()string JSON karena Anda akan menemukan kembali roda dan kemungkinan besar Anda akan salah.
Sasha Chedygov
30

jQuery-1.7.1.js - 555 baris ...

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
sumber
4
Bagus. Argumen yang bagus untuk menggunakan jQuery.
OneWorld
11
Lebih seperti argumen untuk melihat ke dalam jQuery =)
Olga
13

Keuntungan menggunakan json2.js adalah ia hanya akan menginstal parser jika browser belum memilikinya. Anda dapat mempertahankan kompatibilitas dengan browser lama, tetapi gunakan pengurai JSON asli (yang lebih aman dan lebih cepat) jika tersedia.

Browser dengan JSON Asli:

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

G.

Gak
sumber
10

[ Memperluas musicfreak komentar ]

Jika Anda menggunakan jQuery, gunakan parseJSON

var obj = jQuery.parseJSON(data)

Secara internal ia memeriksa apakah browser mendukung .JSON.parse, dan (jika tersedia) memanggil window.JSON.parse asli.

Jika tidak, lakukan parsing sendiri.

Michael Freidgeim
sumber
8

Untuk kepentingan siapa saja yang menjalankan utas ini - untuk daftar terbaru dan definitif dari browser yang mendukung objek JSON, lihat di sini. . Jawaban umum singkat - hampir semua browser yang sangat penting di tahun 2013+.

DroidOS
sumber