diff --git a/1-js/05-data-types/12-json/1-serialize-object/solution.md b/1-js/05-data-types/12-json/1-serialize-object/solution.md index db1bcaa81..980ca83b2 100644 --- a/1-js/05-data-types/12-json/1-serialize-object/solution.md +++ b/1-js/05-data-types/12-json/1-serialize-object/solution.md @@ -2,7 +2,7 @@ ```js let user = { - name: "John Smith", + name: "Іван Іванов", age: 35 }; diff --git a/1-js/05-data-types/12-json/1-serialize-object/task.md b/1-js/05-data-types/12-json/1-serialize-object/task.md index 53343e4c3..4d5a9d08a 100644 --- a/1-js/05-data-types/12-json/1-serialize-object/task.md +++ b/1-js/05-data-types/12-json/1-serialize-object/task.md @@ -2,13 +2,13 @@ importance: 5 --- -# Turn the object into JSON and back +# Перетворіть об’єкт в JSON і назад -Turn the `user` into JSON and then read it back into another variable. +Перетворіть `user` в JSON, а потім перетворіть його назад в іншу змінну. ```js let user = { - name: "John Smith", + name: "Іван Іванов", age: 35 }; ``` diff --git a/1-js/05-data-types/12-json/2-serialize-event-circular/solution.md b/1-js/05-data-types/12-json/2-serialize-event-circular/solution.md index 7a3a533b0..10c11f9e8 100644 --- a/1-js/05-data-types/12-json/2-serialize-event-circular/solution.md +++ b/1-js/05-data-types/12-json/2-serialize-event-circular/solution.md @@ -5,8 +5,8 @@ let room = { }; let meetup = { - title: "Conference", - occupiedBy: [{name: "John"}, {name: "Alice"}], + title: "Конференція", + occupiedBy: [{name: "Іван"}, {name: "Аліса"}], place: room }; @@ -19,12 +19,12 @@ alert( JSON.stringify(meetup, function replacer(key, value) { /* { - "title":"Conference", - "occupiedBy":[{"name":"John"},{"name":"Alice"}], + "title":"Конференція", + "occupiedBy":[{"name":"Іван"},{"name":"Аліса"}], "place":{"number":23} } */ ``` -Here we also need to test `key==""` to exclude the first call where it is normal that `value` is `meetup`. +Тут нам також потрібно перевірити `key==""`, щоб виключити перший виклик, де значення `value` рівне `meetup`. diff --git a/1-js/05-data-types/12-json/2-serialize-event-circular/task.md b/1-js/05-data-types/12-json/2-serialize-event-circular/task.md index 3755a24aa..4627c2989 100644 --- a/1-js/05-data-types/12-json/2-serialize-event-circular/task.md +++ b/1-js/05-data-types/12-json/2-serialize-event-circular/task.md @@ -2,13 +2,13 @@ importance: 5 --- -# Exclude backreferences +# Виключити зворотні посилання -In simple cases of circular references, we can exclude an offending property from serialization by its name. +У простих випадках циклічних посиланнь ми можемо виключити від серіалізації властивість, через яку воно виникло, за її ім’ям. -But sometimes we can't just use the name, as it may be used both in circular references and normal properties. So we can check the property by its value. +Але іноді ми не можемо просто використовувати назву, оскільки вона може використовуватися як і у циклічних посиланнях, так і в нормальних властивостях. Таким чином, ми можемо перевірити властивість за її значенням. -Write `replacer` function to stringify everything, but remove properties that reference `meetup`: +Напишіть функцію `replacer`, щоб серіалізувати все, але видалити властивості, які посилаються на `meetup`: ```js run let room = { @@ -16,25 +16,25 @@ let room = { }; let meetup = { - title: "Conference", - occupiedBy: [{name: "John"}, {name: "Alice"}], + title: "Конференція", + occupiedBy: [{name: "Іван"}, {name: "Аліса"}], place: room }; *!* -// circular references +// циклічне посилання room.occupiedBy = meetup; meetup.self = meetup; */!* alert( JSON.stringify(meetup, function replacer(key, value) { - /* your code */ + /* ваш код */ })); -/* result should be: +/* результат повинен бути: { - "title":"Conference", - "occupiedBy":[{"name":"John"},{"name":"Alice"}], + "title":"Конференція", + "occupiedBy":[{"name":"Іван"},{"name":"Аліса"}], "place":{"number":23} } */ diff --git a/1-js/05-data-types/12-json/article.md b/1-js/05-data-types/12-json/article.md index 425022f8a..efe012d18 100644 --- a/1-js/05-data-types/12-json/article.md +++ b/1-js/05-data-types/12-json/article.md @@ -1,14 +1,14 @@ -# JSON methods, toJSON +# Методи JSON, toJSON -Let's say we have a complex object, and we'd like to convert it into a string, to send it over a network, or just to output it for logging purposes. +Скажімо, у нас є складний об’єкт, і ми хотіли б перетворити його в рядок, щоб відправити його через мережу або просто вивести його для цілей логування. -Naturally, such a string should include all important properties. +Безумовно, такий рядок повинен включати всі важливі властивості. -We could implement the conversion like this: +Ми могли б реалізувати перетворення, наступним чином: ```js run let user = { - name: "John", + name: "Іван", age: 30, *!* @@ -18,26 +18,26 @@ let user = { */!* }; -alert(user); // {name: "John", age: 30} +alert(user); // {name: "Іван", age: 30} ``` -...But in the process of development, new properties are added, old properties are renamed and removed. Updating such `toString` every time can become a pain. We could try to loop over properties in it, but what if the object is complex and has nested objects in properties? We'd need to implement their conversion as well. +... Але в процесі розробки додаються нові властивості, старі властивості перейменовуються та видаляються. Оновлення такого `toString` кожен раз може стати проблемою. Ми могли б спробувати проходити в циклі над властивостями в об’єкті, але що, якщо об’єкт є складним і має вкладені об’єкти у властивостях? Ми також повинні реалізувати їх перетворення. -Luckily, there's no need to write the code to handle all this. The task has been solved already. +На щастя, нема потреби писати код для обробки всього цього. Завдання вже вирішено. ## JSON.stringify -The [JSON](http://en.wikipedia.org/wiki/JSON) (JavaScript Object Notation) is a general format to represent values and objects. It is described as in [RFC 4627](http://tools.ietf.org/html/rfc4627) standard. Initially it was made for JavaScript, but many other languages have libraries to handle it as well. So it's easy to use JSON for data exchange when the client uses JavaScript and the server is written on Ruby/PHP/Java/Whatever. +[JSON](http://uk.wikipedia.org/wiki/json) (JavaScript Object Notation) -- це загальний формат, який представляє значення та об’єкти. Він описується у [RFC 4627](http://tools.ietf.org/html/rfc4627) стандарті. Спочатку він був зроблений для JavaScript, але багато інших мов мають бібліотеки, щоб обробляють його також. Тому легко використовувати JSON для обміну даними, коли клієнт використовує JavaScript, а сервер написаний на Ruby/PHP/Java/що завгодно. -JavaScript provides methods: +JavaScript надає методи: -- `JSON.stringify` to convert objects into JSON. -- `JSON.parse` to convert JSON back into an object. +- `JSON.stringify` для перетворити об’єктів в JSON. +- `JSON.parse` для перетворення JSON назад в об’єкт. -For instance, here we `JSON.stringify` a student: +Наприклад, тут ми викликаємо `JSON.stringify` з об’єктом `student`: ```js run let student = { - name: 'John', + name: 'Іван', age: 30, isAdmin: false, courses: ['html', 'css', 'js'], @@ -48,13 +48,13 @@ let student = { let json = JSON.stringify(student); */!* -alert(typeof json); // we've got a string! +alert(typeof json); // ми отримали рядок! alert(json); *!* -/* JSON-encoded object: +/* JSON-кодований об’єкт: { - "name": "John", + "name": "Іван", "age": 30, "isAdmin": false, "courses": ["html", "css", "js"], @@ -64,35 +64,35 @@ alert(json); */!* ``` -The method `JSON.stringify(student)` takes the object and converts it into a string. +Метод `JSON.stringify(student)` бере об’єкт і перетворює його в рядок. -The resulting `json` string is called a *JSON-encoded* or *serialized* or *stringified* or *marshalled* object. We are ready to send it over the wire or put into a plain data store. +Отриманий `json` рядок називається *JSON-кодованим* або *серіалізованим* об’єктом. Ми готові відправити його по мережі або покласти в просте сховище даних. -Please note that a JSON-encoded object has several important differences from the object literal: +Будь ласка, зверніть увагу, що JSON-кодований об’єкт має кілька важливих відмінностей від літерального об’єкта: -- Strings use double quotes. No single quotes or backticks in JSON. So `'John'` becomes `"John"`. -- Object property names are double-quoted also. That's obligatory. So `age:30` becomes `"age":30`. +- Рядки використовують подвійні лапки. Немає одиничних або зворотніх лапок у JSON. Отже, `'Іван'` стає `'Іван'`. +- Назви властивостей об’єкта також обертаються в подвійні лапки. Це обов’язково. Отже, `age:30` стає `"age":30`. -`JSON.stringify` can be applied to primitives as well. +`JSON.stringify` можна застосувати до примітивів. -JSON supports following data types: +JSON підтримує наступні типи даних: -- Objects `{ ... }` -- Arrays `[ ... ]` -- Primitives: - - strings, - - numbers, - - boolean values `true/false`, +- Об’єкти `{ ... }` +- Масиви `[ ... ]` +- Примітиви: + - рядки, + - числа, + - бульові значення `true/false`, - `null`. -For instance: +Наприклад: ```js run -// a number in JSON is just a number +// число JSON це просто число alert( JSON.stringify(1) ) // 1 -// a string in JSON is still a string, but double-quoted +// рядок в JSON -- це ще рядок, але обернутий в подвійні лапки alert( JSON.stringify('test') ) // "test" alert( JSON.stringify(true) ); // true @@ -100,55 +100,55 @@ alert( JSON.stringify(true) ); // true alert( JSON.stringify([1, 2, 3]) ); // [1,2,3] ``` -JSON is data-only language-independent specification, so some JavaScript-specific object properties are skipped by `JSON.stringify`. +JSON -- це лише незалежна специфікація даних, тому деякі притаманні для JavaScript властивості об’єктів пропускаються в `JSON.stringify`. -Namely: +А саме: -- Function properties (methods). -- Symbolic keys and values. -- Properties that store `undefined`. +- Функціональні властивості (методи). +- Символьні ключі та значення. +- Властивості, що зберігають `undefined`. ```js run let user = { - sayHi() { // ignored + sayHi() { // ігнорується alert("Hello"); }, - [Symbol("id")]: 123, // ignored - something: undefined // ignored + [Symbol("id")]: 123, // ігнорується + something: undefined // ігнорується }; -alert( JSON.stringify(user) ); // {} (empty object) +alert( JSON.stringify(user) ); // {} (порожній об’єкт) ``` -Usually that's fine. If that's not what we want, then soon we'll see how to customize the process. +Зазвичай це добре. Якщо це не те, чого ми хочемо, то скоро ми побачимо, як налаштувати процес. -The great thing is that nested objects are supported and converted automatically. +Чудово, що вкладені об’єкти підтримуються та перетворюються автоматично. -For instance: +Наприклад: ```js run let meetup = { - title: "Conference", + title: "Конференція", *!* room: { number: 23, - participants: ["john", "ann"] + participants: ["Іван", "Анна"] } */!* }; alert( JSON.stringify(meetup) ); -/* The whole structure is stringified: +/* Вся структура серіалізується: { - "title":"Conference", - "room":{"number":23,"participants":["john","ann"]}, + "title":"Конференція", + "room":{"number":23,"participants":["Іван","Анна"]}, } */ ``` -The important limitation: there must be no circular references. +Важливі обмеження: не повинно бути жодних циклічних посилань. -For instance: +Наприклад: ```js run let room = { @@ -156,45 +156,45 @@ let room = { }; let meetup = { - title: "Conference", - participants: ["john", "ann"] + title: "Конференція", + participants: ["Іван", "Анна"] }; -meetup.place = room; // meetup references room -room.occupiedBy = meetup; // room references meetup +meetup.place = room; // meetup посилається на room +room.occupiedBy = meetup; // room посилається на meetup *!* JSON.stringify(meetup); // Error: Converting circular structure to JSON */!* ``` -Here, the conversion fails, because of circular reference: `room.occupiedBy` references `meetup`, and `meetup.place` references `room`: +Тут перетворення не вдається із-за циклічного посилання: `room.occupiedBy` посилається на `meetup`, і `metup.place` посилається на `room`: ![](json-meetup.svg) -## Excluding and transforming: replacer +## За винятком та трансформацією: Замінник -The full syntax of `JSON.stringify` is: +Повний синтаксис `JSON.stringify`: ```js let json = JSON.stringify(value[, replacer, space]) ``` value -: A value to encode. +: Значення для кодування. replacer -: Array of properties to encode or a mapping function `function(key, value)`. +: Масив властивостей для кодування або функція відображення `function(key, value)`. space -: Amount of space to use for formatting +: Кількість пробілів для форматування -Most of the time, `JSON.stringify` is used with the first argument only. But if we need to fine-tune the replacement process, like to filter out circular references, we can use the second argument of `JSON.stringify`. +Зазвичай, `JSON.stringify` використовується лише з першим аргументом. Але якщо нам потрібно добре налаштувати процес заміни, наприклад, якщо ми хочемо відфільтрувати циклічні посилання, то ми можемо використовувати другий аргумент `JSON.stringify`. -If we pass an array of properties to it, only these properties will be encoded. +Якщо ми передаємо йому масив властивостей, то будуть закодовані лише ці властивості. -For instance: +Наприклад: ```js run let room = { @@ -204,18 +204,18 @@ let room = { let meetup = { title: "Conference", participants: [{name: "John"}, {name: "Alice"}], - place: room // meetup references room + place: room // meetup посилається на room }; -room.occupiedBy = meetup; // room references meetup +room.occupiedBy = meetup; // room посилається на meetup alert( JSON.stringify(meetup, *!*['title', 'participants']*/!*) ); // {"title":"Conference","participants":[{},{}]} ``` -Here we are probably too strict. The property list is applied to the whole object structure. So the objects in `participants` are empty, because `name` is not in the list. +Тут ми, мабуть, занадто суворі. Список властивостей застосовується до всієї структури об’єкта. Отже, об’єкти в `participants` є порожніми, тому що `name` не в списку. -Let's include in the list every property except `room.occupiedBy` that would cause the circular reference: +Включімо в список кожної власності, крім `room.occupiedBy`, що призведе до циклічного посилання: ```js run let room = { @@ -223,30 +223,30 @@ let room = { }; let meetup = { - title: "Conference", - participants: [{name: "John"}, {name: "Alice"}], - place: room // meetup references room + title: "Конференція", + participants: [{name: "Іван"}, {name: "Аліса"}], + place: room // meetup посилається на room }; -room.occupiedBy = meetup; // room references meetup +room.occupiedBy = meetup; // room посилається на meetup alert( JSON.stringify(meetup, *!*['title', 'participants', 'place', 'name', 'number']*/!*) ); /* { - "title":"Conference", - "participants":[{"name":"John"},{"name":"Alice"}], + "title":"Конференція", + "participants":[{"name":"Іван"},{"name":"Аліса"}], "place":{"number":23} } */ ``` -Now everything except `occupiedBy` is serialized. But the list of properties is quite long. +Тепер все, крім `occupiedBy`, серіалізується. Але список властивостей досить довгий. -Fortunately, we can use a function instead of an array as the `replacer`. +На щастя, ми можемо використовувати функцію замість масиву, в якості `raplacer`. -The function will be called for every `(key, value)` pair and should return the "replaced" value, which will be used instead of the original one. Or `undefined` if the value is to be skipped. +Функція буде викликана для кожного `(key, value)`, і повинна повернути значення "replaced", яке буде використовуватися замість оригінального. Або `undefined`, якщо значення буде пропущено. -In our case, we can return `value` "as is" for everything except `occupiedBy`. To ignore `occupiedBy`, the code below returns `undefined`: +У нашому випадку ми можемо повернути `value` "як є" для всього, крім `occupiedBy`. Щоб ігнорувати `occupiedBy`, код нижче повертає `undefined`: ```js run let room = { @@ -254,12 +254,12 @@ let room = { }; let meetup = { - title: "Conference", - participants: [{name: "John"}, {name: "Alice"}], - place: room // meetup references room + title: "Конференція", + participants: [{name: "Іван"}, {name: "Аліса"}], + place: room // meetup посилається на room }; -room.occupiedBy = meetup; // room references meetup +room.occupiedBy = meetup; // room посилається на meetup alert( JSON.stringify(meetup, function replacer(key, value) { alert(`${key}: ${value}`); @@ -268,36 +268,36 @@ alert( JSON.stringify(meetup, function replacer(key, value) { /* key:value pairs that come to replacer: : [object Object] -title: Conference +title: Конференція participants: [object Object],[object Object] 0: [object Object] -name: John +name: Іван 1: [object Object] -name: Alice +name: Аліса place: [object Object] number: 23 occupiedBy: [object Object] */ ``` -Please note that `replacer` function gets every key/value pair including nested objects and array items. It is applied recursively. The value of `this` inside `replacer` is the object that contains the current property. +Будь ласка, зверніть увагу, що функція `replacer` отримує кожну пару ключ/значення, включаючи вкладені об’єкти та елементи масиву. Він застосовується рекурсивно. Значення `this` всередині `raplacer` -- це об’єкт, який містить поточну властивість. -The first call is special. It is made using a special "wrapper object": `{"": meetup}`. In other words, the first `(key, value)` pair has an empty key, and the value is the target object as a whole. That's why the first line is `":[object Object]"` in the example above. +Перший виклик особливий. Він зроблений з використанням спеціального "об’єкта обгортки": `{"": meetup}`. Іншими словами, перша пара `(key, value)` має порожній ключ, а значення є цільовим об’єктом загалом. Ось чому перший рядок -- `":[object Object]"` в прикладі вище. -The idea is to provide as much power for `replacer` as possible: it has a chance to analyze and replace/skip even the whole object if necessary. +Ідея полягає в тому, щоб забезпечити якомога більше потужності для функції `replacer`: вона має можливість аналізувати та замінити/пропустити навіть весь об’єкт, якщо це необхідно. -## Formatting: space +## Форматування: пробіл -The third argument of `JSON.stringify(value, replacer, space)` is the number of spaces to use for pretty formatting. +Третій аргумент `JSON.stringify(value, replacer, space)` -- це кількість пробілів, що використовуються для гарного форматування. -Previously, all stringified objects had no indents and extra spaces. That's fine if we want to send an object over a network. The `space` argument is used exclusively for a nice output. +Раніше всі розтягнуті об’єкти не мали відступу та додаткових пробілів. Це добре, якщо ми хочемо надіслати об’єкт через мережу. Аргумент `space` використовується виключно для виводу в зручному для читання вигляді. -Here `space = 2` tells JavaScript to show nested objects on multiple lines, with indentation of 2 spaces inside an object: +Тут `space = 2` указує JavaScript показати вкладені об’єкти на декількох рядках, з відступом у 2 пробіли всередині об’єкта: ```js run let user = { - name: "John", + name: "Іван", age: 25, roles: { isAdmin: false, @@ -306,9 +306,9 @@ let user = { }; alert(JSON.stringify(user, null, 2)); -/* two-space indents: +/* відступ в 2 пробіли: { - "name": "John", + "name": "Іван", "age": 25, "roles": { "isAdmin": false, @@ -317,9 +317,9 @@ alert(JSON.stringify(user, null, 2)); } */ -/* for JSON.stringify(user, null, 4) the result would be more indented: +/* для JSON.stringify(user, null, 4) результат містить більше пробілів: { - "name": "John", + "name": "Іван", "age": 25, "roles": { "isAdmin": false, @@ -329,15 +329,15 @@ alert(JSON.stringify(user, null, 2)); */ ``` -The third argument can also be a string. In this case, the string is used for indentation instead of a number of spaces. +Третій аргумент також може бути рядок. У цьому випадку рядок використовується для відступу замість числа пробілів. -The `space` parameter is used solely for logging and nice-output purposes. +Параметр `space` використовується виключно для логування та гарного виводу. -## Custom "toJSON" +## Спеціальний "toJSON" -Like `toString` for string conversion, an object may provide method `toJSON` for to-JSON conversion. `JSON.stringify` automatically calls it if available. +Подібно до `tostring` для перетворення в рядки, об’єкт може надати метод `toJSON` для перетворення в JSON. `Json.stringify` автоматично викликає його, він доступний. -For instance: +Наприклад: ```js run let room = { @@ -345,7 +345,7 @@ let room = { }; let meetup = { - title: "Conference", + title: "Конференція", date: new Date(Date.UTC(2017, 0, 1)), room }; @@ -353,7 +353,7 @@ let meetup = { alert( JSON.stringify(meetup) ); /* { - "title":"Conference", + "title":"Конференція", *!* "date":"2017-01-01T00:00:00.000Z", // (1) */!* @@ -362,9 +362,9 @@ alert( JSON.stringify(meetup) ); */ ``` -Here we can see that `date` `(1)` became a string. That's because all dates have a built-in `toJSON` method which returns such kind of string. +Тут ми бачимо, що `date` `(1)` став рядком. Це тому, що всі дати мають вбудований метод `toJSON`, який повертає такий вид рядка. -Now let's add a custom `toJSON` for our object `room` `(2)`: +Тепер додаймо спеціальний `toJSON` для нашого об’єкта `room` `(2)`: ```js run let room = { @@ -377,7 +377,7 @@ let room = { }; let meetup = { - title: "Conference", + title: "Конференція", room }; @@ -388,7 +388,7 @@ alert( JSON.stringify(room) ); // 23 alert( JSON.stringify(meetup) ); /* { - "title":"Conference", + "title":"Конференція", *!* "room": 23 */!* @@ -396,28 +396,28 @@ alert( JSON.stringify(meetup) ); */ ``` -As we can see, `toJSON` is used both for the direct call `JSON.stringify(room)` and when `room` is nested in another encoded object. +Як ми бачимо, `toJSON` використовується як для прямого виклику `JSON.stringify(room)`, а також коли властивість `room` вкладена в іншому закодованому об’єкті. ## JSON.parse -To decode a JSON-string, we need another method named [JSON.parse](mdn:js/JSON/parse). +Щоб декодувати JSON-рядок, нам потрібен інший метод, що називається [JSON.parse](mdn:js/JSON/parse). -The syntax: +Синтаксис: ```js let value = JSON.parse(str, [reviver]); ``` str -: JSON-string to parse. +: JSON-рядок для перетворення в об’єкт. reviver -: Optional function(key,value) that will be called for each `(key, value)` pair and can transform the value. +: Необов’язкова функція, яка буде викликана для кожного `(key, value)` та може перетворювати значення. -For instance: +Наприклад: ```js run -// stringified array +// масив у вигляді рядка let numbers = "[0, 1, 2, 3]"; numbers = JSON.parse(numbers); @@ -428,66 +428,66 @@ alert( numbers[1] ); // 1 Or for nested objects: ```js run -let userData = '{ "name": "John", "age": 35, "isAdmin": false, "friends": [0,1,2,3] }'; +let userData = '{ "name": "Іван", "age": 35, "isAdmin": false, "friends": [0,1,2,3] }'; let user = JSON.parse(userData); alert( user.friends[1] ); // 1 ``` -The JSON may be as complex as necessary, objects and arrays can include other objects and arrays. But they must obey the same JSON format. +JSON може бути настільки складним, наскільки це необхідно, об’єкти та масиви можуть включати інші об’єкти та масиви. Але вони повинні дотримуватися того ж формату JSON. -Here are typical mistakes in hand-written JSON (sometimes we have to write it for debugging purposes): +Ось типові помилки в рукописному JSON (іноді ми повинні писати його для знаходження помилок): ```js let json = `{ - *!*name*/!*: "John", // mistake: property name without quotes - "surname": *!*'Smith'*/!*, // mistake: single quotes in value (must be double) - *!*'isAdmin'*/!*: false // mistake: single quotes in key (must be double) - "birthday": *!*new Date(2000, 2, 3)*/!*, // mistake: no "new" is allowed, only bare values - "friends": [0,1,2,3] // here all fine + *!*name*/!*: "Іван", // помилка: ім'я власності без лапок + "surname": *!*'Smith'*/!*, // помилка: одинарні лапки для значень (повинні бути подвійними) + *!*'isAdmin'*/!*: false // помилка: одинарні лапки для ключей (повинні бути подвійними) + "birthday": *!*new Date(2000, 2, 3)*/!*, // помилка: не дозволяється конструктор "new", тільки значення + "friends": [0,1,2,3] // тут все добре }`; ``` -Besides, JSON does not support comments. Adding a comment to JSON makes it invalid. +Крім того, JSON не підтримує коментарі. Додавання коментаря до JSON робить його недійсним. -There's another format named [JSON5](http://json5.org/), which allows unquoted keys, comments etc. But this is a standalone library, not in the specification of the language. +Існує інший формат, який називається [JSON5](http://json5.org/), що підтримує ключі не обернені в лапки, коментарі тощо. Але це окрема бібліотека, а не частина специфікації мови. -The regular JSON is that strict not because its developers are lazy, but to allow easy, reliable and very fast implementations of the parsing algorithm. +Звичайний JSON є настільки строгим не тому, що її розробники ледачі, а тому, що дозволяє легко, надійно та дуже швидко реалізувати алгоритм кодування та читання. -## Using reviver +## Використання функції відновлення -Imagine, we got a stringified `meetup` object from the server. +Уявіть, що ми отримали серіалізований об’єкт `metchup` з сервера. -It looks like this: +Це виглядає так: ```js // title: (meetup title), date: (meetup date) -let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}'; +let str = '{"title":"Конференція","date":"2017-11-30T12:00:00.000Z"}'; ``` -...And now we need to *deserialize* it, to turn back into JavaScript object. +...І тепер нам потрібно *десеріалізувати* цей об’єкт, щоб перетворити його в об’єкт JavaScript. -Let's do it by calling `JSON.parse`: +Зробімо це, викликавши `JSON.parse`: ```js run -let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}'; +let str = '{"title":"Конференція","date":"2017-11-30T12:00:00.000Z"}'; let meetup = JSON.parse(str); *!* -alert( meetup.date.getDate() ); // Error! +alert( meetup.date.getDate() ); // Помилка! */!* ``` -Whoops! An error! +Ой! Помилка! -The value of `meetup.date` is a string, not a `Date` object. How could `JSON.parse` know that it should transform that string into a `Date`? +Значення `metaup.date` -- це рядок, а не об’єкт `Date`. Як `JSON.parse` знає, що він повинен перетворити цей рядок на об’єкт `Date`? -Let's pass to `JSON.parse` the reviving function as the second argument, that returns all values "as is", but `date` will become a `Date`: +Передаймо до `JSON.parse` функції відновлення як другий аргумент, який повертає всі значення "як є", але `date` стане об’єктом `Date`: ```js run -let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}'; +let str = '{"title":"Конференція","date":"2017-11-30T12:00:00.000Z"}'; *!* let meetup = JSON.parse(str, function(key, value) { @@ -496,16 +496,16 @@ let meetup = JSON.parse(str, function(key, value) { }); */!* -alert( meetup.date.getDate() ); // now works! +alert( meetup.date.getDate() ); // зараз працює! ``` -By the way, that works for nested objects as well: +До речі, це також працює для вкладених об’єктів: ```js run let schedule = `{ "meetups": [ - {"title":"Conference","date":"2017-11-30T12:00:00.000Z"}, - {"title":"Birthday","date":"2017-04-18T12:00:00.000Z"} + {"title":"Конференція","date":"2017-11-30T12:00:00.000Z"}, + {"title":"День народження","date":"2017-04-18T12:00:00.000Z"} ] }`; @@ -515,16 +515,16 @@ schedule = JSON.parse(schedule, function(key, value) { }); *!* -alert( schedule.meetups[1].date.getDate() ); // works! +alert( schedule.meetups[1].date.getDate() ); // працює! */!* ``` -## Summary +## Підсумки -- JSON is a data format that has its own independent standard and libraries for most programming languages. -- JSON supports plain objects, arrays, strings, numbers, booleans, and `null`. -- JavaScript provides methods [JSON.stringify](mdn:js/JSON/stringify) to serialize into JSON and [JSON.parse](mdn:js/JSON/parse) to read from JSON. -- Both methods support transformer functions for smart reading/writing. -- If an object has `toJSON`, then it is called by `JSON.stringify`. +- JSON -- це формат даних, який має власний незалежний стандарт та бібліотеки для більшості мов програмування. +- JSON підтримує прості об’єкти, масиви, рядки, цифри, булеві значення та `null`. +- JavaScript надає методи [JSON.stringify](mdn:js/JSON/stringify) для серіалізування в JSON і [JSON.parse](mdn:js/JSON/parse), щоб зчитати данні з JSON. +- Обидва методи підтримують функції трансформації для інтелектуального читання/запису. +- Якщо об’єкт має метод `toJSON`, то він викликається при виконанні `JSON.stringify`.