You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/05-data-types/11-json/article.md
+23-23Lines changed: 23 additions & 23 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -21,7 +21,7 @@ let user = {
21
21
alert(user); // {name: "John", age: 30}
22
22
```
23
23
24
-
...Но в процессе разработки добавляются новые свойства, старые свойства переименовываются и удаляются. Обновление такого `toString` каждый раз может стать проблемой. Мы могли бы попытаться перебрать свойства в нем, но что, если объект является сложным и имеет вложенные объекты в свойствах? Мы должны были бы также осуществить их преобразование. И, если мы отправляем объект по сети, нам также нужно предоставить код для «чтения» нашего объекта на принимающей стороне.
24
+
...Но в процессе разработки добавляются новые свойства, старые свойства переименовываются и удаляются. Обновление такого `toString` каждый раз может стать проблемой. Мы могли бы попытаться перебрать свойства в нем, но что, если объект является сложным и имеет вложенные объекты в свойствах? Мы должны были бы также осуществить их преобразование. И, если мы отправляем объект по сети, нам также нужно предоставить код для "чтения" нашего объекта на принимающей стороне.
25
25
26
26
К счастью, нет необходимости писать код для обработки всего этого. У задачи есть простое решение.
27
27
@@ -66,17 +66,17 @@ alert(json);
66
66
67
67
Метод `JSON.stringify(student)` берет объект и преобразует его в строку.
68
68
69
-
Полученная строка `json` называется *JSON-кодированным* или *сериализованным*, *строковым* или *структурированным* объектом. Мы готовы отправить его по сети или поместить в обычное хранилище данных.
69
+
Полученная строка `json` называется *JSON-форматированным*, *сериализованным*, *строчным* или же *структурированным* объектом. Мы можем отправить его по сети или поместить в обычное хранилище данных.
70
70
71
71
72
-
Обратите внимание, что JSON-кодированный объект имеет несколько важных отличий от объектного литерала:
72
+
Обратите внимание, что объект в формате JSON имеет несколько важных отличий от объектного литерала:
73
73
74
74
- Строки используют двойные кавычки. Никаких одинарных кавычек или обратных кавычек в JSON. Так `'John'` становится `"John"`.
75
75
- Имена свойств объекта также заключаются в двойные кавычки. Это обязательно. Так `age:30` становится `"age":30`.
76
76
77
77
`JSON.stringify` может быть применен и к примитивам.
JSON является спецификацией только для данных на нескольких язках, поэтому некоторые специфичные для JavaScript свойства объекта в `JSON.stringify` пропускаются.
103
+
JSON является кросс-языковой спецификацией для данных, поэтому `JSON.stringify` пропускает некоторые специфические свойства объектов JavaScript.
Здесь мы, наверное, слишком строги. Список свойств применяется ко всей структуре объекта. Так что свойство `participants` пустое, потому что `name` нет в списке.
216
+
Здесь мы, наверно, слишком строги. Список свойств применяется ко всей структуре объекта. Так что свойство `participants` пустое, потому что `name` нет в списке.
217
217
218
218
Давайте включим все свойства, кроме `room.occupiedBy`, из-за которого появляется цикличная ссылка:
Теперь все, кроме `occupiedBy`, сериализовано. Но список свойств довольно длинный.
244
244
245
-
К счастью,в качестве `replacer` мы можем использовать функцию, а не массив.
245
+
К счастью,в качестве `replacer` мы можем использовать функцию, а не массив.
246
246
247
-
Функция будет вызываться для каждой пары `(key, value)` и должна возвращать «замененное» значение, которое будет использоваться вместо исходного.
247
+
Функция будет вызываться для каждой пары `(key, value)` и должна возвращать "замененное" значение, которое будет использоваться вместо исходного.
248
248
249
-
В нашем случае мы можем вернуть `value`«как есть» для всего, кроме `occupiedBy`. Чтобы игнорировать `occupiedBy`, код ниже возвращает `undefined`:
249
+
В нашем случае мы можем вернуть `value`"как есть" для всего, кроме `occupiedBy`. Чтобы игнорировать `occupiedBy`, код ниже возвращает `undefined`:
250
250
251
251
```js run
252
252
let room = {
@@ -281,16 +281,16 @@ number: 23
281
281
282
282
Обратите внимание, что функция `replacer` получает каждую пару ключ/значение, включая вложенные объекты и элементы массива. И она применяется рекурсивно. Значение `this` внутри `replacer` - это объект, который содержит текущее свойство.
283
283
284
-
Первый вызов - особенный. Ему передается специальный "объект-обертка": `{"": meetup}`. Другими словами, первая `(key, value)` пара имеет пустой ключ, а значением является целевой объект в целом. Вот почему первая строка будет `":[object Object]"` в примере выше.
284
+
Первый вызов - особенный. Ему передается специальный "объект-обертка": `{"": meetup}`. Другими словами, первая `(key, value)` пара имеет пустой ключ, а значением является целевой объект в целом. Вот почему первая строка из примера выше будет `":[object Object]"`.
285
285
286
286
Идея состоит в том, чтобы переложить как можно больше действий на `replacer` - у него есть возможность проанализировать и заменить/пропустить весь объект целиком, если это необходимо.
287
287
288
288
289
289
## Форматирование: spacer
290
290
291
-
Третий аргумент `JSON.stringify(value, replacer, spaces)` - это количество пробелов, используемых для удобного форматирования.
291
+
Третий аргумент в `JSON.stringify(value, replacer, spaces)` - это количество отступов, используемых для удобного форматирования.
292
292
293
-
Ранее все строковые объекты не имели отступов и лишних пробелов. Это нормально, если мы хотим отправить объект по сети. Аргумент `spacer` используется исключительно для вывода в удобочитаемом виде.
293
+
Ранее все строчные объекты не имели отступов и лишних пробелов. Это нормально, если мы хотим отправить объект по сети. Аргумент `spacer` используется исключительно для вывода в удобочитаемом виде.
294
294
295
295
Ниже `spacer = 2` указывает JavaScript отображать вложенные объекты в несколько строк с отступом в 2 пробела внутри объекта:
Параметр `spaces`используется исключительно для логирования и красивого вывода.
331
+
Параметр `spaces`применяется для логирования и красивого вывода.
332
332
333
-
## Пользовательский «toJSON»
333
+
## Пользовательский "toJSON"
334
334
335
335
Как и `toString` для преобразования строк, объект может предоставлять метод `toJSON` для преобразования в JSON. `JSON.stringify` автоматически вызывает его, если он есть.
336
336
@@ -406,7 +406,7 @@ let value = JSON.parse(str[, reviver]);
406
406
```
407
407
408
408
str
409
-
: JSON-строка для разбора.
409
+
: преобразуемая JSON-строка.
410
410
411
411
reviver
412
412
: Необязательная функция с параметрами (ключ, значение), которая будет вызываться для каждой пары `(key, value)` и может преобразовывать значение.
@@ -448,13 +448,13 @@ let json = `{
448
448
449
449
Кроме того, JSON не поддерживает комментарии. Добавление комментария в JSON делает его недействительным.
450
450
451
-
Существует еще один формат [JSON5](http://json5.org/), который позволяет вводить ключи без кавычек, комментарии и т.д. Но это самостоятельная библиотека, не в спецификации языка.
451
+
Существует еще один формат [JSON5](http://json5.org/), который поддерживает ключи без кавычек, комментарии и т.д. Но это самостоятельная библиотека, а не спецификация языка.
452
452
453
453
Обычный JSON настолько строг не потому, что его разработчики ленивы, а потому, что позволяет легко, надежно и очень быстро реализовывать алгоритм парсинга.
454
454
455
455
## Использование reviver
456
456
457
-
Представьте себе, мы получили строковый объект `meetup` с сервера.
457
+
Представьте себе, мы получили объект `meetup` с сервера в виде строчки данных.
- JSON поддерживает простые объекты, массивы, строки, числа, логические значения и `null`.
525
525
- JavaScript предоставляет методы [JSON.stringify](mdn:js/JSON/stringify) для сериализации в JSON и [JSON.parse](mdn:js/JSON/parse) для чтения из JSON.
526
526
- Оба метода поддерживают функции преобразования для интеллектуального чтения/записи.
527
-
- Если объект имеет `toJSON`, то он вызывается `JSON.stringify`.
527
+
- Если объект имеет метод `toJSON`, то он вызывается через`JSON.stringify`.
0 commit comments