JSON

by 2 contributors:

Сводка

Объект JSON содержит методы для разбора объектной нотации JavaScript (JavaScript Object Notation — сокращённо JSON) и преобразования значений в JSON. Его нельзя вызвать как функцию или сконструировать как объект, и кроме своих двух методов он не содержит никакой интересной функциональности.

Описание

Объектная нотация JavaScript

JSON является синтаксисом для сериализации объектов, массивов, чисел, строк логических значений и значения null. Он основывается на синтаксисе JavaScript, однако всё же отличается от него: не каждый код на JavaScript является JSON, и не каждый JSON является кодом на JavaScript. Смотрите также статью JSON: подмножество JavaScript, которым он не является (на английском).

Различия между JavaScript и JSON
Тип JavaScript Отличия от JSON
Объекты и массивы Имена свойств должны быть строками, заключёнными в двойные кавычки; конечные запятые запрещены.
Числа Ведущие нули запрещены; перед десятичной запятой обязательно должна быть хотя бы одна цифра.
Строки

Только ограниченный набор символов может быть заэкранирован; некоторые управляющие символы запрещены; разрешены юникодные символы разделительной линии (U+2028) и разделительного параграфа (U+2029); строки должны быть заключены в двойные кавычки. Смотрите следующий пример, в котором метод JSON.parse() отрабатывает без проблем, а при вычислении кода как JavaScript выбрасывается исключение SyntaxError:

var code = '"\u2028\u2029"';
JSON.parse(code); // работает
eval(code); // ошибка

Ниже представлен полный синтаскис JSON:

JSON = null
   или true или false
   или ЧислоJSON
   или СтрокаJSON
   или ОбъектJSON
   или МассивJSON

ЧислоJSON = - ПоложительноеЧисло
        или ПоложительноеЧисло
ПоложительноеЧисло = ДесятичноеЧисло
                 или ДесятичноеЧисло . Цифры
                 или ДесятичноеЧисло . Цифры ПоказательСтепени
                 или ДесятичноеЧисло ПоказательСтепени
ДесятичноеЧисло = 0
              или ОтОдногоДоДевяти Цифры
ПоказательСтепени = e Степень
                или E Степень
Степень = Цифры
      или + Цифры
      или - Цифры
Цифры = Цифра
    или Цифры Цифра
Цифра = от 0 до 9
ОтОдногоДоДевяти = от 1 до 9

СтрокаJSON = ""
         или " СимволыСтроки "
СимволыСтроки = СимволСтроки
            или СимволыСтроки СимволСтроки
СимволСтроки = любой символ
               за исключением " или \ или от U+0000 до U+001F
           или ЭкранПослед
ЭкранПослед = \" или \/ или \\ или \b или \f или \n или \r или \t
          или \u ШестЦифра ШестЦифра ШестЦифра ШестЦифра
ШестЦифра = от 0 до 9
        или от A до F
        или от a до f

ОбъектJSON = { }
         или { Члены }
Члены = СтрокаJSON : JSON
    или Члены , СтрокаJSON : JSON

МассивJSON = [ ]
         или [ ЭлементыМассива ]
ЭлементыМассива = JSON
              или ЭлементыМассива , JSON

Во всех продукциях могут присутствовать незначащие пробельные символы, за исключением продукций ЧислоJSON (числа не должны содержать пробелов) и СтрокаJSON (где они интерпретируются как часть строки или возбуждают ошибку). Пробельными символами считаются символы табуляции (U+0009), возврата каретки (U+000D), перевода строки (U+000A) и, собственно, пробела (U+0020).

Методы

JSON.parse()
Разбирает строку JSON, возможно с преобразованием получаемого значения и его свойств и возвращает разобранное значение.
JSON.stringify()
Возвращает строку JSON, соответствующую указанному значению, возможно с включением только определённых свойств или с заменой значений свойств определяемым пользователем способом.

Полифилл

Объект JSON не поддерживается старыми браузерами. Вы можете работать с ним, добавив следующий код в начало ваших скриптов, он позволяет использовать объект JSON в реализациях, которые его ещё не поддерживают (например, в Internet Explorer 6).

Следующий алгоритм имитирует работу настоящего объекта JSON:

if (!window.JSON) {
  window.JSON = {
    parse: function(sJSON) { return eval('(' + sJSON + ')'); },
    stringify: function(vContent) {
      if (vContent instanceof Object) {
        var sOutput = '';
        if (vContent.constructor === Array) {
          for (var nId = 0; nId < vContent.length; sOutput += this.stringify(vContent[nId]) + ',', nId++);
          return '[' + sOutput.substr(0, sOutput.length - 1) + ']';
        }
        if (vContent.toString !== Object.prototype.toString) {
          return '"' + vContent.toString().replace(/"/g, '\\$&') + '"';
        }
        for (var sProp in vContent) {
          sOutput += '"' + sProp.replace(/"/g, '\\$&') + '":' + this.stringify(vContent[sProp]) + ',';
        }
        return '{' + sOutput.substr(0, sOutput.length - 1) + '}';
     }
     return typeof vContent === 'string' ? '"' + vContent.replace(/"/g, '\\$&') + '"' : String(vContent);
    }
  };
}

Более сложными известными полифиллами для объекта JSON являются проекты JSON2 и JSON3.

Спецификации

Спецификация Статус Комментарии
ECMAScript 5.1 (ECMA-262)
Определение 'JSON' в этой спецификации.
Стандарт  
ECMAScript 6 (ECMA-262)
Определение 'JSON' в этой спецификации.
Кандидат в рекомендации  

Совместимость с браузерами

Возможность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка (Да) 3.5 (1.9.1) 8.0 10.5 4.0
Возможность Android Chrome для Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базовая поддержка (Да) (Да) 1.0 (1.0) (Да) (Да) (Да)

На основе таблицы совместимости Kangax.

Смотрите также

Метки документа и участники

Contributors to this page: Mingun, fscholz
Обновлялась последний раз: Mingun,