From 074785cea106179cb3305637055ab0a009ca74f2 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:42:52 -0500 Subject: initial commit --- .../reference/global_objects/json/index.html | 230 +++++++++++++++++++++ .../reference/global_objects/json/parse/index.html | 150 ++++++++++++++ .../global_objects/json/stringify/index.html | 189 +++++++++++++++++ 3 files changed, 569 insertions(+) create mode 100644 files/ru/web/javascript/reference/global_objects/json/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/json/parse/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/json/stringify/index.html (limited to 'files/ru/web/javascript/reference/global_objects/json') diff --git a/files/ru/web/javascript/reference/global_objects/json/index.html b/files/ru/web/javascript/reference/global_objects/json/index.html new file mode 100644 index 0000000000..30cc3735af --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/json/index.html @@ -0,0 +1,230 @@ +--- +title: JSON +slug: Web/JavaScript/Reference/Global_Objects/JSON +tags: + - JSON + - JavaScript + - Object + - Reference + - polyfill +translation_of: Web/JavaScript/Reference/Global_Objects/JSON +--- +
{{JSRef("Global_Objects", "JSON")}}
+ +

Сводка

+ +

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

+ +

Описание

+ +

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

+ +

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

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

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

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

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

+ +
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
+ +

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

+ +

Методы

+ +
+
{{jsxref("JSON.parse()")}}
+
Разбирает строку JSON, возможно с преобразованием получаемого значения и его свойств и возвращает разобранное значение.
+
{{jsxref("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.

+ +

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

+ + + + + + + + + + + + + + + + + + + +
СпецификацияСтатусКомментарии
{{SpecName('ES5.1', '#sec-15.12', 'JSON')}}{{Spec2('ES5.1')}}
{{SpecName('ES6', '#sec-json-object', 'JSON')}}{{Spec2('ES6')}}
+ +

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

+ +
{{CompatibilityTable}}
+ +
+ + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatVersionUnknown}}{{CompatGeckoDesktop("1.9.1")}}{{CompatIE("8.0")}}{{CompatOpera("10.5")}}{{CompatSafari("4.0")}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatGeckoMobile("1.0")}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+ +

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

+ +

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

+ + diff --git a/files/ru/web/javascript/reference/global_objects/json/parse/index.html b/files/ru/web/javascript/reference/global_objects/json/parse/index.html new file mode 100644 index 0000000000..febd8ba943 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/json/parse/index.html @@ -0,0 +1,150 @@ +--- +title: JSON.parse() +slug: Web/JavaScript/Reference/Global_Objects/JSON/parse +tags: + - ECMAScript5 + - JSON + - JavaScript + - Method + - Reference +translation_of: Web/JavaScript/Reference/Global_Objects/JSON/parse +--- +
{{JSRef("Global_Objects", "JSON")}}
+ +

Сводка

+

Метод JSON.parse() разбирает строку JSON, возможно с преобразованием получаемого в процессе разбора значения.

+ +

Синтаксис

+
JSON.parse(text[, reviver])
+ +

Параметры

+
+
text
+
Разбираемая строка JSON. Смотрите документацию по объекту {{jsxref("JSON")}} для описания синтаксиса JSON.
+
reviver {{optional_inline}}
+
Если параметр является функцией, определяет преобразование полученного в процессе разбора значения, прежде, чем оно будет возвращено вызывающей стороне.
+
+ +

Возвращаемое значение

+

Возвращает объект {{jsxref("Object")}}, соответствующий переданной строке JSON text.

+ +

Выбрасываемые исключения

+

Выбрасывает исключение {{jsxref("SyntaxError")}}, если разбираемая строка не является правильным JSON.

+ +

Примеры

+ +

Пример: использование метода JSON.parse()

+
JSON.parse('{}');              // {}
+JSON.parse('true');            // true
+JSON.parse('"foo"');           // "foo"
+JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
+JSON.parse('null');            // null
+
+ +

Пример: использование параметра reviver

+

Если определён параметр reviver, значение, вычисляемое при разборе строки, будет преобразовано перед его возвратом. В частности, вычисленное значение и все его свойства (начиная с самых вложенных свойств и кончая самим значением), каждое проходят через функцию reviver, которая вызывается с контекстом this, содержащим объект в виде обрабатываемого свойства, и с аргументами: именем свойства в виде строки и значением свойства. Если функция reviver вернёт {{jsxref("undefined")}} (либо вообще не вернёт никакого значения, например, если выполнение достигнет конца функции), свойство будет удалено из объекта. В противном случае свойство будет переопределено возвращаемым значением.

+

В конечном итоге, функция reviver вызывается с пустой строкой и самым верхним значением, чтобы обеспечить преобразование самого верхнего значения. Убедитесь, что вы правильно обрабатываете этот случай — обычно для этого нужно просто вернуть само значение — или метод JSON.parse() вернёт {{jsxref("undefined")}}.

+
JSON.parse('{"p": 5}', function(k, v) {
+  if (k === '') { return v; } // самое верхнее значение - возвращаем его
+  return v * 2;               // иначе возвращаем v * 2.
+});                           // { p: 10 }
+
+JSON.parse('{"1": 1, "2": 2, "3": {"4": 4, "5": {"6": 6}}}', function(k, v) {
+  console.log(k); // пишем имя текущего свойства, последним именем будет ""
+  return v;       // возвращаем неизменённое значение свойства
+});
+
+// 1
+// 2
+// 4
+// 6
+// 5
+// 3
+// ""
+
+ +

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

+ + + + + + + + + + + + + + + + + + +
СпецификацияСтатусКомментарии
{{SpecName('ES5.1', '#sec-15.12.2', 'JSON.parse')}}{{Spec2('ES5.1')}}Изначальное определение. Реализована в JavaScript 1.7.
{{SpecName('ES6', '#sec-json.parse', 'JSON.parse')}}{{Spec2('ES6')}} 
+ +

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

+
{{CompatibilityTable}}
+
+ + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatVersionUnknown}}{{CompatGeckoDesktop("1.9.1")}}{{CompatIE("8.0")}}{{CompatOpera("10.5")}}{{CompatSafari("4.0")}}
+
+
+ + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatGeckoMobile("1.0")}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+

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

+ +

Примечания по Gecko

+

Начиная с Gecko 29 {{geckoRelease("29")}}, при передаче некорректной строки JSON выдаётся более подробное собщение об ошибке, содержащее номер строки и колонки, в которых была обнаружена ошибка разбора. Это полезно при отладке больших данных JSON.

+
JSON.parse('[1, 2, 3,]');
+// SyntaxError: JSON.parse: unexpected character at
+// line 1 column 10 of the JSON data
+// SyntaxError: JSON.parse: неожиданный символ
+// в строке 1, колонке 10 данных JSON
+
+ +

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

+ diff --git a/files/ru/web/javascript/reference/global_objects/json/stringify/index.html b/files/ru/web/javascript/reference/global_objects/json/stringify/index.html new file mode 100644 index 0000000000..04ccba32a7 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/json/stringify/index.html @@ -0,0 +1,189 @@ +--- +title: JSON.stringify() +slug: Web/JavaScript/Reference/Global_Objects/JSON/stringify +tags: + - JSON + - JavaScript + - Method + - Reference +translation_of: Web/JavaScript/Reference/Global_Objects/JSON/stringify +--- +
{{JSRef("Global_Objects", "JSON")}}
+ +

Сводка

+ +

Метод JSON.stringify() преобразует значение JavaScript в строку JSON, возможно с заменой значений, если указана функция замены, или с включением только определённых свойств, если указан массив замены.

+ +

Синтаксис

+ +
JSON.stringify(value[, replacer[, space]])
+ +

Параметры

+ +
+
value
+
Значение, преобразуемое в строку JSON.
+
replacer {{optional_inline}}
+
Если является функцией, преобразует значения и свойства по ходу их преобразования в строку; если является массивом, определяет набор свойств, включаемых в объект в окончательной строке.
+ Подробное описание функции replacer даётся в статье Использование родного объекта JSON руководства по JavaScript.
+
space {{optional_inline}}
+
Делает результат красиво отформатированным (расставляя пробелы).
+
+ +

Описание

+ +

Метод JSON.stringify() преобразует значение в представляющую его нотацию JSON со следующими оговорками:

+ + + +
JSON.stringify({});                  // '{}'
+JSON.stringify(true);                // 'true'
+JSON.stringify('foo');               // '"foo"'
+JSON.stringify([1, 'false', false]); // '[1,"false",false]'
+JSON.stringify({ x: 5 });            // '{"x":5}'
+
+JSON.stringify({ x: 5, y: 6 });
+// '{"x":5,"y":6}' or '{"y":6,"x":5}'
+JSON.stringify([new Number(1), new String('false'), new Boolean(false)]);
+// '[1,"false",false]'
+
+// Символы:
+JSON.stringify({ x: undefined, y: Object, z: Symbol('') });
+// '{}'
+JSON.stringify({ [Symbol('foo')]: 'foo' });
+// '{}'
+JSON.stringify({ [Symbol.for('foo')]: 'foo' }, [Symbol.for('foo')]);
+// '{}'
+JSON.stringify({ [Symbol.for('foo')]: 'foo' }, function(k, v) {
+  if (typeof k === 'symbol') {
+    return 'символ';
+  }
+});
+// '{}'
+
+ +

Параметр space

+ +

Параметр space может использоваться для управления форматированием отступов в конечной строке. Если он числовой, каждый последующий уровень вложенности будет дополнен отступом из пробелов, количество которых соответствует уровню (вплоть до десятого уровня). Если он строковый, каждый последующий уровень вложенности будет предваряться этой строкой (или её первыми десятью символами).

+ +
JSON.stringify({ a: 2 }, null, ' ');
+// '{
+//  "a": 2
+// }'
+
+ +

Использование символа табуляции имитирует стандартное красивое форматирование:

+ +
JSON.stringify({ uno: 1, dos: 2 }, null, '\t');
+// вернёт строку:
+// '{
+// 	"uno": 1,
+// 	"dos": 2
+// }'
+
+ +

Поведение метода toJSON()

+ +

Если преобразуемый в строку объект имеет свойство с именем toJSON и значением свойства, установленным в функцию, то этот метод toJSON() изменит стандартное поведение преобразования в JSON: вместо преобразования объекта будет использоваться значение, возвращаемое методом toJSON(). Например:

+ +
+

Функции не являются допустимыми данными в JSON, так что они не будут работать. Кроме того, некоторые объекты, например, объект {{jsxref("Date")}}, станут строками после применения {{jsxref("JSON.parse()")}}.

+
+ +
var obj = {
+  foo: 'foo',
+  toJSON: function() {
+    return 'bar';
+  }
+};
+JSON.stringify(obj);        // '"bar"'
+JSON.stringify({ x: obj }); // '{"x":"bar"}'
+
+ +

Пример использования метода JSON.stringify() вместе с localStorage

+ +

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

+ +
// Создаём некоторый объект
+var session = {
+  'screens': [],
+  'state': true
+};
+session.screens.push({ 'name': 'экранА', 'width': 450, 'height': 250 });
+session.screens.push({ 'name': 'экранБ', 'width': 650, 'height': 350 });
+session.screens.push({ 'name': 'экранВ', 'width': 750, 'height': 120 });
+session.screens.push({ 'name': 'экранГ', 'width': 250, 'height': 60 });
+session.screens.push({ 'name': 'экранД', 'width': 390, 'height': 120 });
+session.screens.push({ 'name': 'экранЕ', 'width': 1240, 'height': 650 });
+
+// Преобразуем его в строку JSON с помощью метода JSON.stringify(),
+// затем сохраняем его в localStorage под именем session
+localStorage.setItem('session', JSON.stringify(session));
+
+// Пример того, как можно преобразовать строку, полученную с помощью метода
+// JSON.stringify() и сохранённую в localStorage обратно в объект
+var restoredSession = JSON.parse(localStorage.getItem('session'));
+
+// Переменная restoredSession содержит объект, который был сохранён
+// в localStorage
+console.log(restoredSession);
+
+ +

Пример использования параметра replacer

+ +
var foo = { foundation: 'Mozilla', model: 'box', week: 45, transport: 'car', month: 7 };
+
+JSON.stringify(foo, function(key, value) {
+  if (typeof value === 'string') {
+    return undefined; // удаляем все строковые свойства
+  }
+  return value;
+});  // '{"week":45,"month":7}'
+
+JSON.stringify(foo, ['week', 'month']);
+// '{"week":45,"month":7}', сохранились только свойства week и month
+
+ +

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

+ + + + + + + + + + + + + + + + + + + +
СпецификацияСтатусКомментарии
{{SpecName('ES5.1', '#sec-15.12.3', 'JSON.stringify')}}{{Spec2('ES5.1')}}Изначальное определение. Реализована в JavaScript 1.7.
{{SpecName('ES6', '#sec-json.stringify', 'JSON.stringify')}}{{Spec2('ES6')}}
+ +

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

+ +
+ + +

{{Compat("javascript.builtins.JSON.stringify")}}

+
+ + + +

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

+ + -- cgit v1.2.3-54-g00ecf