--- title: JSON slug: Web/JavaScript/Reference/Global_Objects/JSON tags: - JSON - JavaScript - Object - Reference - polyfill translation_of: Web/JavaScript/Reference/Global_Objects/JSON --- <div>{{JSRef("Global_Objects", "JSON")}}</div> <h2 id="Summary" name="Summary">Сводка</h2> <p>Объект <strong><code>JSON</code></strong> содержит методы для разбора <a class="external" href="http://json.org/">объектной нотации JavaScript</a> (JavaScript Object Notation — сокращённо {{glossary("JSON")}}) и преобразования значений в JSON. Его нельзя вызвать как функцию или сконструировать как объект, и кроме своих двух методов он не содержит никакой интересной функциональности.</p> <h2 id="Description" name="Description">Описание</h2> <h3 id="JavaScript_Object_Notation" name="JavaScript_Object_Notation">Объектная нотация JavaScript</h3> <p>JSON является синтаксисом для сериализации объектов, массивов, чисел, строк логических значений и значения {{jsxref("null")}}. Он основывается на синтаксисе JavaScript, однако всё же отличается от него: не каждый код на JavaScript является JSON, и не каждый JSON является кодом на JavaScript. Смотрите также статью <a href="http://timelessrepo.com/json-isnt-a-javascript-subset">JSON: подмножество JavaScript, которым он не является</a> (на английском).</p> <table> <caption>Различия между JavaScript и JSON</caption> <thead> <tr> <th scope="col">Тип JavaScript</th> <th scope="col">Отличия от JSON</th> </tr> </thead> <tbody> <tr> <td>Объекты и массивы</td> <td>Имена свойств должны быть строками, заключёнными в двойные кавычки; конечные запятые запрещены.</td> </tr> <tr> <td>Числа</td> <td>Ведущие нули запрещены; перед десятичной запятой обязательно должна быть хотя бы одна цифра.</td> </tr> <tr> <td>Строки</td> <td> <p>Только ограниченный набор символов может быть заэкранирован; некоторые управляющие символы запрещены; разрешены юникодные символы разделительной линии (<a href="http://unicode-table.com/ru/2028/">U+2028</a>) и разделительного параграфа (<a href="http://unicode-table.com/ru/2029/">U+2029</a>); строки должны быть заключены в двойные кавычки. Смотрите следующий пример, в котором метод {{jsxref("JSON.parse()")}} отрабатывает без проблем, а при вычислении кода как JavaScript выбрасывается исключение {{jsxref("SyntaxError")}}:</p> <pre class="brush: js"> var code = '"\u2028\u2029"'; JSON.parse(code); // работает eval(code); // ошибка </pre> </td> </tr> </tbody> </table> <p>Ниже представлен полный синтаксис JSON:</p> <pre class="line-numbers language-html"><code class="language-html">JSON = null or true or false or JSONNumber or JSONString or JSONObject or JSONArray JSONNumber = - PositiveNumber or PositiveNumber PositiveNumber = DecimalNumber or DecimalNumber . Digits or DecimalNumber . Digits ExponentPart or DecimalNumber ExponentPart DecimalNumber = 0 or OneToNine Digits ExponentPart = e Exponent or E Exponent Exponent = Digits or + Digits or - Digits Digits = Digit or Digits Digit Digit = 0 through 9 OneToNine = 1 through 9 JSONString = "" or " StringCharacters " StringCharacters = StringCharacter or StringCharacters StringCharacter StringCharacter = any character except " or \ or U+0000 through U+001F or EscapeSequence EscapeSequence = \" or \/ or \\ or \b or \f or \n or \r or \t or \u HexDigit HexDigit HexDigit HexDigit HexDigit = 0 through 9 or A through F or a through f JSONObject = { } or { Members } Members = JSONString : JSON or Members , JSONString : JSON JSONArray = [ ] or [ ArrayElements ] ArrayElements = JSON or ArrayElements , JSON</code></pre> <p>Во всех продукциях могут присутствовать незначащие пробельные символы, за исключением продукций <code><var>ЧислоJSON</var></code> (числа не должны содержать пробелов) и <code><var>СтрокаJSON</var></code> (где они интерпретируются как часть строки или возбуждают ошибку). Пробельными символами считаются символы табуляции (<a href="http://unicode-table.com/ru/0009/">U+0009</a>), возврата каретки (<a href="http://unicode-table.com/ru/000D/">U+000D</a>), перевода строки (<a href="http://unicode-table.com/ru/000A/">U+000A</a>) и, собственно, пробела (<a href="http://unicode-table.com/ru/0020/">U+0020</a>).</p> <h2 id="Methods" name="Methods">Методы</h2> <dl> <dt>{{jsxref("JSON.parse()")}}</dt> <dd>Разбирает строку JSON, возможно с преобразованием получаемого значения и его свойств и возвращает разобранное значение.</dd> <dt>{{jsxref("JSON.stringify()")}}</dt> <dd>Возвращает строку JSON, соответствующую указанному значению, возможно с включением только определённых свойств или с заменой значений свойств определяемым пользователем способом.</dd> </dl> <h2 id="Polyfill" name="Polyfill">Полифил</h2> <p>Объект <code>JSON</code> не поддерживается старыми браузерами. Вы можете работать с ним, добавив следующий код в начало ваших скриптов, он позволяет использовать объект <code>JSON</code> в реализациях, которые его ещё не поддерживают (например, в Internet Explorer 6).</p> <p>Следующий алгоритм имитирует работу настоящего объекта <code>JSON</code>:</p> <pre class="brush: js">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); } }; } </pre> <p>Более сложными известными <a class="external" href="http://remysharp.com/2010/10/08/what-is-a-polyfill/">полифилами</a> для объекта <code>JSON</code> являются проекты <a class="link-https" href="https://github.com/douglascrockford/JSON-js">JSON2</a> и <a class="external" href="http://bestiejs.github.com/json3">JSON3</a>.</p> <h2 id="Specifications" name="Specifications">Спецификации</h2> <table class="standard-table"> <tbody> <tr> <th scope="col">Спецификация</th> <th scope="col">Статус</th> <th scope="col">Комментарии</th> </tr> <tr> <td>{{SpecName('ES5.1', '#sec-15.12', 'JSON')}}</td> <td>{{Spec2('ES5.1')}}</td> <td></td> </tr> <tr> <td>{{SpecName('ES6', '#sec-json-object', 'JSON')}}</td> <td>{{Spec2('ES6')}}</td> <td></td> </tr> </tbody> </table> <h2 id="Browser_compatibility" name="Browser_compatibility">Совместимость с браузерами</h2> <p>{{Compat}}</p> <h2 id="See_also" name="See_also">Смотрите также</h2> <ul> <li><a href="/ru/docs/Web/JavaScript/Guide/Using_native_JSON">Использование родного объекта <code>JSON</code></a></li> <li>{{jsxref("Date.prototype.toJSON()")}}</li> </ul>