Підтримка браузера JSON (window.JSON)


92

Я бачив посилання на деякі браузери, які спочатку підтримують синтаксичний аналіз / серіалізацію об’єктів JSON безпечно та ефективно через window.JSONоб’єкт, але деталей важко отримати. Чи може хтось вказати в правильному напрямку? Які методи пропонує цей Об’єкт? У яких браузерах він підтримується?


8
Див. Коли можна використовувати аналіз JSON? для отримання інформації про браузери з рідною підтримкою об’єкта JSON .
outis

Відповіді:


108

Усі сучасні браузери підтримують власне кодування / декодування JSON (Internet Explorer 8+, Firefox 3.1+, Safari 4+ та Chrome 3+). В основному, JSON.parse(str)аналізує рядок JSON strі повертає об’єкт, а JSON.stringify(obj)також повертає представлення JSON об’єкта obj.

Детальніше про статтю MDN .


Я знаю, що підтримка не є широко поширеною, але використання цього методу має бути набагато швидшим та безпечнішим, ніж eval () введення рядка, тому я хочу використовувати його там, де це можливо. Будь-яка ідея щодо підтримки з боку інших браузерів?
levik

17
О, і на додатковій записці, НІКОЛИ не зрівняйте () рядки JSON. Натомість використовуйте одну з багатьох доступних бібліотек розбору JSON.
Саша Чедигов

1
@colbeerhey: Так, саме цього я бачу найчастіше. Ви також можете вкрасти jQuery.
Саша Чедигов

2
Для довідки, коли ви говорите "НІКОЛИ eval () ...", а потім згадуєте, що json2 - це популярна бібліотека, варто зауважити, що вона використовує eval, але вона намагається перевірити рядок за допомогою регулярного виразу. Це швидше, ніж перевірка та синтаксичний аналіз рядка, хоча є аналізатори, які не перевіряють з порівнянною продуктивністю. json2.js все ще є, мабуть, найкращим вибором, хоча б лише завдяки своїй поширеності.
TheXenocide

2
@TheXenocide: Хороша думка, але його автор, ймовірно, витратив значну частину часу на цей код перевірки, тому я кажу, що ніколи не використовуйте eval()рядки JSON, оскільки ви будете винаходити колесо, і, швидше за все, помилитесь.
Саша Чедигов

30

jQuery-1.7.1.js - рядок 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
Приємно. Хороший аргумент для використання jQuery.
OneWorld

11
Більше схоже на аргумент, щоб заглянути всередину jQuery =)
Ольга

13

Перевага використання json2.js полягає в тому, що він встановлюватиме синтаксичний аналізатор лише у тому випадку, якщо браузер його ще не має. Ви можете підтримувати сумісність із старими браузерами, але використовуйте власний парсер JSON (який є більш безпечним і швидшим), якщо він доступний.

Браузери з рідною JSON:

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

Г.


10

[розширення коментаря musicfreak ]

Якщо ви використовуєте jQuery, використовуйте parseJSON

var obj = jQuery.parseJSON(data)

Внутрішньо він перевіряє, чи підтримує браузер .JSON.parse, і (якщо є) викликає рідне window.JSON.parse.

Якщо ні, то розбирає сам.


8

На користь тих, хто потрапляє в цю тему - тут можна переглянути оновлений, остаточний список браузерів, що підтримують об’єкт JSON . . Коротка загальна відповідь - майже всі браузери, які дійсно мають значення в 2013+ році.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.