Tarayıcıda yerel JSON desteği (window.JSON)


92

Nesnelerin JSON ayrıştırma / serileştirmesini window.JSONNesne aracılığıyla güvenli ve verimli bir şekilde destekleyen bazı tarayıcılara referanslar gördüm , ancak ayrıntılara ulaşmak zor. Doğru yönü gösteren biri olabilir mi? Bu Nesnenin ortaya koyduğu yöntemler nelerdir? Hangi tarayıcılar altında destekleniyor?


8
Bkz JSON ayrıştırma zaman kullanabilirsiniz? JSON nesnesi için yerel desteğe sahip tarayıcılar hakkında bilgi için .
outis

Yanıtlar:


108

Tüm modern tarayıcılar yerel JSON kodlama / kod çözmeyi destekler (Internet Explorer 8+, Firefox 3.1+, Safari 4+ ve Chrome 3+). Temel olarak, JSON.parse(str)JSON dizesini ayrıştırıp strbir nesne döndürür ve nesnenin JSON.stringify(obj)JSON temsilini döndürür obj.

MDN makalesi hakkında daha fazla ayrıntı .


Desteğin yaygın olmadığını biliyorum, ancak bu yöntemi kullanmak bir dizeyi değerlendirmekten () çok daha hızlı ve daha güvenli olmalı, bu yüzden mevcut olduğu yerde onu kullanmak istiyorum. Diğer tarayıcılardan destek hakkında bir fikriniz var mı?
levik

17
Bir yan not olarak, ASLA eval () JSON dizeleri. Bunun yerine, mevcut birçok JSON ayrıştırma kitaplığından birini kullanın.
Sasha Chedygov

1
@colbeerhey: Evet, en sık gördüğüm şey bu. Ayrıca jQuery'leri de çalabilirsiniz.
Sasha Chedygov

2
Referans olarak, "NEVER eval () ..." dediğinizde ve ardından json2'nin popüler olarak desteklenen kitaplık olduğundan bahsettiğinizde, eval kullandığını, ancak dizeyi önce regex kullanarak doğrulamaya çalıştığını belirtmek gerekir. Karşılaştırılabilir performansla doğrulanmayan ayrıştırıcılar olsa da, bu dizeyi doğrulamaktan ve ayrıştırmaktan daha hızlıdır. json2.js, yalnızca yaygınlığı nedeniyle, muhtemelen en iyi seçimdir.
TheXenocide

2
@TheXenocide: İyi bir nokta, ancak yazarı muhtemelen bu doğrulama kodu için epey zaman harcadı, bu yüzden asla eval()JSON dizeleri diyorum çünkü tekerleği yeniden icat edeceksin ve muhtemelen yanlış anlayacaksın.
Sasha Chedygov

30

jQuery-1.7.1.js - 555 satır ...

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
Güzel. JQuery kullanmak için iyi bir argüman.
OneWorld

11
Daha çok jQuery'nin içine bakmak için bir argüman gibi =)
Olga

13

Json2.js kullanmanın avantajı, yalnızca tarayıcıda bir ayrıştırıcı yoksa bir ayrıştırıcı kurmasıdır. Eski tarayıcılarla uyumluluğu koruyabilirsiniz, ancak mevcutsa yerel JSON ayrıştırıcısını (daha güvenli ve daha hızlı olan) kullanabilirsiniz.

Yerel JSON'a sahip tarayıcılar:

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

G.


10

[ musicfreak yorumu genişletiliyor ]

JQuery kullanıyorsanız, parseJSON kullanın

var obj = jQuery.parseJSON(data)

Dahili olarak tarayıcının .JSON.parse'ı destekleyip desteklemediğini kontrol eder ve (varsa) yerel window.JSON.parse öğesini çağırır.

Değilse, kendini ayrıştırır.


8

Bu iş parçacığına giren herkesin yararı için - JSON nesnesini destekleyen güncel ve eksiksiz tarayıcı listesi için buraya bakın. . Kısa bir genel cevap - 2013+ yılında gerçekten önemli olan hemen hemen tüm tarayıcılar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.