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
+30-30Lines changed: 30 additions & 30 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Формат JSON, метод toJSON
2
2
3
-
Допустим, у нас есть сложный объект, и мы хотели бы преобразовать его в строку, отправить по сети или просто вывести для логирования.
3
+
Допустим, у нас есть сложный объект, и мы хотели бы преобразовать его в строку, чтобы отправить по сети или просто вывести для логирования.
4
4
5
5
Естественно, такая строка должна включать в себя все важные свойства.
6
6
@@ -21,20 +21,20 @@ let user = {
21
21
alert(user); // {name: "John", age: 30}
22
22
```
23
23
24
-
...Но в процессе разработки добавляются новые свойства, старые свойства переименовываются и удаляются. Обновление такого `toString` каждый раз может стать проблемой. Мы могли бы попытаться зациклить свойства в нем, но что, если объект является сложным и имеет вложенные объекты в свойствах? Мы должны были бы также осуществить их преобразование. И, если мы отправляем объект по сети, нам также нужно предоставить код для «чтения» нашего объекта на принимающей стороне.
24
+
...Но в процессе разработки добавляются новые свойства, старые свойства переименовываются и удаляются. Обновление такого `toString` каждый раз может стать проблемой. Мы могли бы попытаться перебрать свойства в нем, но что, если объект является сложным и имеет вложенные объекты в свойствах? Мы должны были бы также осуществить их преобразование. И, если мы отправляем объект по сети, нам также нужно предоставить код для «чтения» нашего объекта на принимающей стороне.
25
25
26
26
К счастью, нет необходимости писать код для обработки всего этого. У задачи есть простое решение.
27
27
28
28
## JSON.stringify
29
29
30
-
[JSON](https://ru.wikipedia.org/wiki/JSON) (JavaScript Object Notation) это общий формат для представления значений и объектов. Его описание задокументировано в стандарте [RFC 4627](http://tools.ietf.org/html/rfc4627). Первоначально он был создан для JavaScript, но многие другие языки также имеют библиотеки, которые также могут работать с ним. Таким образом, JSON легко использовать для обмена данными, когда клиент использует JavaScript а сервер написан на Ruby/PHP/Java/любой другой язык.
30
+
[JSON](https://ru.wikipedia.org/wiki/JSON) (JavaScript Object Notation) - это общий формат для представления значений и объектов. Его описание задокументировано в стандарте [RFC 4627](http://tools.ietf.org/html/rfc4627). Первоначально он был создан для JavaScript, но многие другие языки также имеют библиотеки, которые могут работать с ним. Таким образом, JSON легко использовать для обмена данными, когда клиент использует JavaScript, а сервер написан на Ruby/PHP/Java/любой другой язык.
31
31
32
32
JavaScript предоставляет методы:
33
33
34
34
-`JSON.stringify` для преобразования объектов в JSON.
35
35
-`JSON.parse` для преобразования JSON обратно в объект.
36
36
37
-
Например, здесь мы преобразуем через `JSON.stringify`карточку студента:
37
+
Например, здесь мы преобразуем через `JSON.stringify`данные студента:
38
38
```js run
39
39
let student = {
40
40
name:'John',
@@ -48,11 +48,11 @@ let student = {
48
48
let json =JSON.stringify(student);
49
49
*/!*
50
50
51
-
alert(typeof json); // мы получим строку!
51
+
alert(typeof json); // мы получили строку!
52
52
53
53
alert(json);
54
54
*!*
55
-
/* выведет записанный в JSON объект:
55
+
/* выведет объект в формате JSON:
56
56
{
57
57
"name": "John",
58
58
"age": 30,
@@ -66,7 +66,7 @@ alert(json);
66
66
67
67
Метод `JSON.stringify(student)` берет объект и преобразует его в строку.
68
68
69
-
Полученная `json`строка называется *JSON-кодированным* или *сериализованным*, *строковым* или *структурированным* объектом. Мы готовы отправить его по проводам или поместить в обычное хранилище данных.
69
+
Полученная строка `json` называется *JSON-кодированным* или *сериализованным*, *строковым* или *структурированным* объектом. Мы готовы отправить его по сети или поместить в обычное хранилище данных.
70
70
71
71
72
72
Обратите внимание, что JSON-кодированный объект имеет несколько важных отличий от объектного литерала:
@@ -89,22 +89,22 @@ alert(json);
89
89
Например:
90
90
91
91
```js run
92
-
// число в JSON - всего лишь числовое значение
92
+
// число в JSON остается числом
93
93
alert( JSON.stringify(1) ) // 1
94
94
95
-
// строка в JSON по-прежнему является строкой, но имеет двойные кавычки
95
+
// строка в JSON по-прежнему остается строкой, но в двойных кавычках
96
96
alert( JSON.stringify('test') ) // "test"
97
97
98
98
alert( JSON.stringify(true) ); // true
99
99
100
100
alert( JSON.stringify([1, 2, 3]) ); // [1,2,3]
101
101
```
102
102
103
-
JSON является кросс-языковой спецификацией только для данных, поэтому некоторые специфичные для JavaScript свойства объекта в `JSON.stringify` пропускаются.
103
+
JSON является спецификацией только для данных на нескольких язках, поэтому некоторые специфичные для JavaScript свойства объекта в `JSON.stringify` пропускаются.
let json =JSON.stringify(value[, replacer, space])
@@ -185,12 +185,12 @@ value
185
185
: Значение для кодирования.
186
186
187
187
replacer
188
-
: Массив свойств для кодирования или функции отображения`function(key, value)`.
188
+
: Массив свойств для кодирования или функции соответствия`function(key, value)`.
189
189
190
190
space
191
191
: Дополнительное пространство (отступы), используемое для форматирования.
192
192
193
-
В большинстве случаев `JSON.stringify` используется только с первым аргументом. Но если нам нужно отфильтровать процесс замены, например, отфильтровать циклические ссылки, то можно использовать второй аргумент `JSON.stringify`.
193
+
В большинстве случаев `JSON.stringify` используется только с первым аргументом. Но если нам нужно настроить процесс замены, например, отфильтровать циклические ссылки, то можно использовать второй аргумент `JSON.stringify`.
194
194
195
195
Если мы передадим ему массив свойств, будут закодированы только эти свойства.
Здесь мы, наверное, слишком строги. Список свойств применяется ко всей структуре объекта. Так что участники пусты, потому что `name` нет в списке.
216
+
Здесь мы, наверное, слишком строги. Список свойств применяется ко всей структуре объекта. Так что свойство `participants` пустое, потому что `name` нет в списке.
217
217
218
-
Давайте включим все свойства, кроме `room.occupiedBy`, что вызовет цикличную ссылку:
218
+
Давайте включим все свойства, кроме `room.occupiedBy`, из-за которого появляется цикличная ссылка:
219
219
220
220
```js run
221
221
let room = {
@@ -262,11 +262,11 @@ let meetup = {
262
262
room.occupiedBy= meetup; // room ссылается на meetup
alert(`${key}: ${value}`); // чтобы посмотреть, что получит заменитель
265
+
alert(`${key}: ${value}`); // чтобы посмотреть, что получит replacer
266
266
return (key =='occupiedBy') ?undefined: value;
267
267
}));
268
268
269
-
/* пары ключ:значение, которые приходят на замену:
269
+
/* пары ключ:значение, которые приходят в replacer:
270
270
: [object Object]
271
271
title: Conference
272
272
participants: [object Object],[object Object]
@@ -279,9 +279,9 @@ number: 23
279
279
*/
280
280
```
281
281
282
-
Обратите внимание, что функция `replacer` получает каждую пару ключ/значение, включая вложенные объекты и элементы массива и это применяется рекурсивно. Значение `this` внутри `replacer` - это объект, который содержит текущее свойство.
282
+
Обратите внимание, что функция `replacer` получает каждую пару ключ/значение, включая вложенные объекты и элементы массива. И она применяется рекурсивно. Значение `this` внутри `replacer` - это объект, который содержит текущее свойство.
283
283
284
-
Первый вызов - особенный. Он делается с помощью специальной «обертки объекта»: `{"": meetup}`. Другими словами, первая `(key, value)` пара имеет пустой ключ, а значением является целевой объект в целом. Вот почему первая строка будет `":[object Object]"` в примере выше.
284
+
Первый вызов - особенный. Ему передается специальный "объект-обертка": `{"": meetup}`. Другими словами, первая `(key, value)` пара имеет пустой ключ, а значением является целевой объект в целом. Вот почему первая строка будет `":[object Object]"` в примере выше.
285
285
286
286
Идея состоит в том, чтобы переложить как можно больше действий на `replacer` - у него есть возможность проанализировать и заменить/пропустить весь объект целиком, если это необходимо.
Параметр `spaces` используется исключительно для протоколирования и позиционирования выходных данных.
331
+
Параметр `spaces` используется исключительно для логирования и красивого вывода.
332
332
333
333
## Пользовательский «toJSON»
334
334
335
-
Как и `toString` для преобразования строк, объект может предоставлять метод `toJSON` для преобразования в JSON. `JSON.stringify` автоматически вызывает его, если доступно.
335
+
Как и `toString` для преобразования строк, объект может предоставлять метод `toJSON` для преобразования в JSON. `JSON.stringify` автоматически вызывает его, если он есть.
Как видим, `toJSON` используется как для прямого вызова`JSON.stringify(room)`, так и для вложенного объекта.
396
+
Теперь получается, что `toJSON` используется как при прямом вызове`JSON.stringify(room)`, так и на вложенном объекте.
397
397
398
398
399
399
## JSON.parse
@@ -432,7 +432,7 @@ user = JSON.parse(user);
432
432
alert( user.friends[1] ); // 1
433
433
```
434
434
435
-
JSON может быть настолько сложным, насколько это необходимо, объекты и массивы могут включать другие объекты и массивы. Но они должны подчиняться формату.
435
+
JSON может быть настолько сложным, насколько это необходимо, объекты и массивы могут включать другие объекты и массивы. Но они должны быть в том же формате.
436
436
437
437
Вот типичные ошибки в написанном от руки JSON (иногда приходится писать его для отладки):
438
438
@@ -456,14 +456,14 @@ let json = `{
456
456
457
457
Представьте себе, мы получили строковый объект `meetup` с сервера.
458
458
459
-
Похоже на то:
459
+
Вот такой:
460
460
461
461
```js
462
462
// title: (meetup title), date: (meetup date)
463
463
let str ='{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
464
464
```
465
465
466
-
...А теперь нам нужно *десериализовать* его, чтобы снова превратить в объект JavaScript.
466
+
...А теперь нам нужно *десериализовать* его, т.е. снова превратить в объект JavaScript.
0 commit comments