Skip to content

Commit 5f0f4b7

Browse files
lex111alfill
andauthored
Apply suggestions from code review
Правки, потерянные в git'е Co-Authored-By: alfill <7522884+alfill@users.noreply.github.com>
1 parent 332f797 commit 5f0f4b7

2 files changed

Lines changed: 32 additions & 32 deletions

File tree

1-js/05-data-types/11-json/1-serialize-object/task.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ importance: 5
22

33
---
44

5-
# Превратите объект в JSON и верните обратно
5+
# Преобразуйте объект в JSON, а затем обратно в обычный объект
66

7-
Превратите `user` в JSON, затем прочитайте его в другую переменную.
7+
Преобразуйте `user` в JSON, затем поместите в новую переменную изначальный объект.
88

99
```js
1010
let user = {

1-js/05-data-types/11-json/article.md

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Формат JSON, метод toJSON
22

3-
Допустим, у нас есть сложный объект, и мы хотели бы преобразовать его в строку, отправить по сети или просто вывести для логирования.
3+
Допустим, у нас есть сложный объект, и мы хотели бы преобразовать его в строку, чтобы отправить по сети или просто вывести для логирования.
44

55
Естественно, такая строка должна включать в себя все важные свойства.
66

@@ -21,20 +21,20 @@ let user = {
2121
alert(user); // {name: "John", age: 30}
2222
```
2323

24-
...Но в процессе разработки добавляются новые свойства, старые свойства переименовываются и удаляются. Обновление такого `toString` каждый раз может стать проблемой. Мы могли бы попытаться зациклить свойства в нем, но что, если объект является сложным и имеет вложенные объекты в свойствах? Мы должны были бы также осуществить их преобразование. И, если мы отправляем объект по сети, нам также нужно предоставить код для «чтения» нашего объекта на принимающей стороне.
24+
...Но в процессе разработки добавляются новые свойства, старые свойства переименовываются и удаляются. Обновление такого `toString` каждый раз может стать проблемой. Мы могли бы попытаться перебрать свойства в нем, но что, если объект является сложным и имеет вложенные объекты в свойствах? Мы должны были бы также осуществить их преобразование. И, если мы отправляем объект по сети, нам также нужно предоставить код для «чтения» нашего объекта на принимающей стороне.
2525

2626
К счастью, нет необходимости писать код для обработки всего этого. У задачи есть простое решение.
2727

2828
## JSON.stringify
2929

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/любой другой язык.
3131

3232
JavaScript предоставляет методы:
3333

3434
- `JSON.stringify` для преобразования объектов в JSON.
3535
- `JSON.parse` для преобразования JSON обратно в объект.
3636

37-
Например, здесь мы преобразуем через `JSON.stringify` карточку студента:
37+
Например, здесь мы преобразуем через `JSON.stringify` данные студента:
3838
```js run
3939
let student = {
4040
name: 'John',
@@ -48,11 +48,11 @@ let student = {
4848
let json = JSON.stringify(student);
4949
*/!*
5050

51-
alert(typeof json); // мы получим строку!
51+
alert(typeof json); // мы получили строку!
5252

5353
alert(json);
5454
*!*
55-
/* выведет записанный в JSON объект:
55+
/* выведет объект в формате JSON:
5656
{
5757
"name": "John",
5858
"age": 30,
@@ -66,7 +66,7 @@ alert(json);
6666

6767
Метод `JSON.stringify(student)` берет объект и преобразует его в строку.
6868

69-
Полученная `json` строка называется *JSON-кодированным* или *сериализованным*, *строковым* или *структурированным* объектом. Мы готовы отправить его по проводам или поместить в обычное хранилище данных.
69+
Полученная строка `json` называется *JSON-кодированным* или *сериализованным*, *строковым* или *структурированным* объектом. Мы готовы отправить его по сети или поместить в обычное хранилище данных.
7070

7171

7272
Обратите внимание, что JSON-кодированный объект имеет несколько важных отличий от объектного литерала:
@@ -89,22 +89,22 @@ alert(json);
8989
Например:
9090

9191
```js run
92-
// число в JSON - всего лишь числовое значение
92+
// число в JSON остается числом
9393
alert( JSON.stringify(1) ) // 1
9494

95-
// строка в JSON по-прежнему является строкой, но имеет двойные кавычки
95+
// строка в JSON по-прежнему остается строкой, но в двойных кавычках
9696
alert( JSON.stringify('test') ) // "test"
9797

9898
alert( JSON.stringify(true) ); // true
9999

100100
alert( JSON.stringify([1, 2, 3]) ); // [1,2,3]
101101
```
102102

103-
JSON является кросс-языковой спецификацией только для данных, поэтому некоторые специфичные для JavaScript свойства объекта в `JSON.stringify` пропускаются.
103+
JSON является спецификацией только для данных на нескольких язках, поэтому некоторые специфичные для JavaScript свойства объекта в `JSON.stringify` пропускаются.
104104

105105
А именно:
106106

107-
- Свойства функции (методы).
107+
- Свойства-функции (методы).
108108
- Символические свойства.
109109
- Свойства, которые хранят `undefined`.
110110

@@ -138,7 +138,7 @@ let meetup = {
138138
};
139139

140140
alert( JSON.stringify(meetup) );
141-
/* вся структура преобразована:
141+
/* вся структура преобразована в строку:
142142
{
143143
"title":"Conference",
144144
"room":{"number":23,"participants":["john","ann"]},
@@ -175,7 +175,7 @@ JSON.stringify(meetup); // Ошибка: Преобразование цикли
175175

176176
## Исключение и преобразование: replacer
177177

178-
Полный синтаксис `JSON.stringify` таков:
178+
Полный синтаксис `JSON.stringify`:
179179

180180
```js
181181
let json = JSON.stringify(value[, replacer, space])
@@ -185,12 +185,12 @@ value
185185
: Значение для кодирования.
186186

187187
replacer
188-
: Массив свойств для кодирования или функции отображения `function(key, value)`.
188+
: Массив свойств для кодирования или функции соответствия `function(key, value)`.
189189

190190
space
191191
: Дополнительное пространство (отступы), используемое для форматирования.
192192

193-
В большинстве случаев `JSON.stringify` используется только с первым аргументом. Но если нам нужно отфильтровать процесс замены, например, отфильтровать циклические ссылки, то можно использовать второй аргумент `JSON.stringify`.
193+
В большинстве случаев `JSON.stringify` используется только с первым аргументом. Но если нам нужно настроить процесс замены, например, отфильтровать циклические ссылки, то можно использовать второй аргумент `JSON.stringify`.
194194

195195
Если мы передадим ему массив свойств, будут закодированы только эти свойства.
196196

@@ -213,9 +213,9 @@ alert( JSON.stringify(meetup, *!*['title', 'participants']*/!*) );
213213
// {"title":"Conference","participants":[{},{}]}
214214
```
215215

216-
Здесь мы, наверное, слишком строги. Список свойств применяется ко всей структуре объекта. Так что участники пусты, потому что `name` нет в списке.
216+
Здесь мы, наверное, слишком строги. Список свойств применяется ко всей структуре объекта. Так что свойство `participants` пустое, потому что `name` нет в списке.
217217

218-
Давайте включим все свойства, кроме `room.occupiedBy`, что вызовет цикличную ссылку:
218+
Давайте включим все свойства, кроме `room.occupiedBy`, из-за которого появляется цикличная ссылка:
219219

220220
```js run
221221
let room = {
@@ -262,11 +262,11 @@ let meetup = {
262262
room.occupiedBy = meetup; // room ссылается на meetup
263263

264264
alert( JSON.stringify(meetup, function replacer(key, value) {
265-
alert(`${key}: ${value}`); // чтобы посмотреть, что получит заменитель
265+
alert(`${key}: ${value}`); // чтобы посмотреть, что получит replacer
266266
return (key == 'occupiedBy') ? undefined : value;
267267
}));
268268

269-
/* пары ключ:значение, которые приходят на замену:
269+
/* пары ключ:значение, которые приходят в replacer:
270270
: [object Object]
271271
title: Conference
272272
participants: [object Object],[object Object]
@@ -279,9 +279,9 @@ number: 23
279279
*/
280280
```
281281

282-
Обратите внимание, что функция `replacer` получает каждую пару ключ/значение, включая вложенные объекты и элементы массива и это применяется рекурсивно. Значение `this` внутри `replacer` - это объект, который содержит текущее свойство.
282+
Обратите внимание, что функция `replacer` получает каждую пару ключ/значение, включая вложенные объекты и элементы массива. И она применяется рекурсивно. Значение `this` внутри `replacer` - это объект, который содержит текущее свойство.
283283

284-
Первый вызов - особенный. Он делается с помощью специальной «обертки объекта»: `{"": meetup}`. Другими словами, первая `(key, value)` пара имеет пустой ключ, а значением является целевой объект в целом. Вот почему первая строка будет `":[object Object]"` в примере выше.
284+
Первый вызов - особенный. Ему передается специальный "объект-обертка": `{"": meetup}`. Другими словами, первая `(key, value)` пара имеет пустой ключ, а значением является целевой объект в целом. Вот почему первая строка будет `":[object Object]"` в примере выше.
285285

286286
Идея состоит в том, чтобы переложить как можно больше действий на `replacer` - у него есть возможность проанализировать и заменить/пропустить весь объект целиком, если это необходимо.
287287

@@ -328,11 +328,11 @@ alert(JSON.stringify(user, null, 2));
328328
*/
329329
```
330330

331-
Параметр `spaces` используется исключительно для протоколирования и позиционирования выходных данных.
331+
Параметр `spaces` используется исключительно для логирования и красивого вывода.
332332

333333
## Пользовательский «toJSON»
334334

335-
Как и `toString` для преобразования строк, объект может предоставлять метод `toJSON` для преобразования в JSON. `JSON.stringify` автоматически вызывает его, если доступно.
335+
Как и `toString` для преобразования строк, объект может предоставлять метод `toJSON` для преобразования в JSON. `JSON.stringify` автоматически вызывает его, если он есть.
336336

337337
Например:
338338

@@ -359,9 +359,9 @@ alert( JSON.stringify(meetup) );
359359
*/
360360
```
361361

362-
Здесь мы можем видеть, что `date` `(1)` стал строкой. Это потому, что все объекты имеют встроенный `toJSON` метод, который возвращает такую строку.
362+
Как видим, `date` `(1)` стал строкой. Это потому, что все объекты имеют встроенный метод `toJSON`, который возвращает такую строку.
363363

364-
Теперь давайте добавим пользовательский `toJSON` для нашего объекта `room` `(2)`:
364+
Теперь давайте добавим собственную реализацию метода `toJSON` в наш объект `room` `(2)`:
365365

366366
```js run
367367
let room = {
@@ -393,7 +393,7 @@ alert( JSON.stringify(meetup) );
393393
*/
394394
```
395395

396-
Как видим, `toJSON` используется как для прямого вызова `JSON.stringify(room)`, так и для вложенного объекта.
396+
Теперь получается, что `toJSON` используется как при прямом вызове `JSON.stringify(room)`, так и на вложенном объекте.
397397

398398

399399
## JSON.parse
@@ -432,7 +432,7 @@ user = JSON.parse(user);
432432
alert( user.friends[1] ); // 1
433433
```
434434

435-
JSON может быть настолько сложным, насколько это необходимо, объекты и массивы могут включать другие объекты и массивы. Но они должны подчиняться формату.
435+
JSON может быть настолько сложным, насколько это необходимо, объекты и массивы могут включать другие объекты и массивы. Но они должны быть в том же формате.
436436

437437
Вот типичные ошибки в написанном от руки JSON (иногда приходится писать его для отладки):
438438

@@ -456,14 +456,14 @@ let json = `{
456456

457457
Представьте себе, мы получили строковый объект `meetup` с сервера.
458458

459-
Похоже на то:
459+
Вот такой:
460460

461461
```js
462462
// title: (meetup title), date: (meetup date)
463463
let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
464464
```
465465

466-
...А теперь нам нужно *десериализовать* его, чтобы снова превратить в объект JavaScript.
466+
...А теперь нам нужно *десериализовать* его, т.е. снова превратить в объект JavaScript.
467467

468468
Давайте сделаем это, вызвав `JSON.parse`:
469469

@@ -481,7 +481,7 @@ alert( meetup.date.getDate() ); // Error!
481481

482482
Значением `meetup.date` является строка, а не `Date` объект. Как мог `JSON.parse` знать, что он должен преобразовать эту строку в `Date`?
483483

484-
Давайте перейдем к `JSON.parse` функции восстановления, которая возвращает все значения «как есть», но `date` станет `Date`:
484+
Давайте перейдем к функции восстановления `JSON.parse`, которая возвращает все значения «как есть», но `date` станет `Date`:
485485

486486
```js run
487487
let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';

0 commit comments

Comments
 (0)