Сводка
Объект JSON содержит методы для разбора объектной нотации JavaScript (JavaScript Object Notation — сокращённо JSON) и преобразования значений в JSON. Его нельзя вызвать как функцию или сконструировать как объект, и кроме своих двух методов он не содержит никакой интересной функциональности.
Описание
Объектная нотация JavaScript
JSON является синтаксисом для сериализации объектов, массивов, чисел, строк логических значений и значения null. Он основывается на синтаксисе JavaScript, однако всё же отличается от него: не каждый код на JavaScript является JSON, и не каждый JSON является кодом на JavaScript. Смотрите также статью JSON: подмножество JavaScript, которым он не является (на английском).
| Тип JavaScript | Отличия от JSON |
|---|---|
| Объекты и массивы | Имена свойств должны быть строками, заключёнными в двойные кавычки; конечные запятые запрещены. |
| Числа | Ведущие нули запрещены; перед десятичной запятой обязательно должна быть хотя бы одна цифра. |
| Строки |
Только ограниченный набор символов может быть заэкранирован; некоторые управляющие символы запрещены; разрешены юникодные символы разделительной линии (U+2028) и разделительного параграфа (U+2029); строки должны быть заключены в двойные кавычки. Смотрите следующий пример, в котором метод 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.