Поддержка JSON в браузере (window.JSON)

92

Я видел ссылки на некоторые браузеры, изначально поддерживающие синтаксический анализ / сериализацию JSON объектов безопасно и эффективно через window.JSONObject, но подробностей найти трудно. Может ли кто-нибудь указать в правильном направлении? Какие методы предоставляет этот объект? В каких браузерах он поддерживается?

левик
источник
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 () со строкой, поэтому я хочу использовать его там, где он доступен. Есть идеи о поддержке со стороны других браузеров?
левик
17
О, и еще одно примечание: НИКОГДА не используйте строки eval () JSON. Вместо этого используйте одну из многих доступных библиотек синтаксического анализа JSON.
Саша Чедыгов
1
@colbeerhey: Да, это я чаще всего вижу. Вы также можете украсть файлы jQuery.
Саша Чедыгов 06
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,
lks
источник
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+ году.

DroidOS
источник