ÐопÑÑÑим, Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑложнÑй обÑекÑ, и Ð¼Ñ Ñ Ð¾Ñели Ð±Ñ Ð¿ÑеобÑазоваÑÑ ÐµÐ³Ð¾ в ÑÑÑокÑ, ÑÑÐ¾Ð±Ñ Ð¾ÑпÑавиÑÑ Ð¿Ð¾ ÑеÑи или пÑоÑÑо вÑвеÑÑи Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸ÑованиÑ.
ÐÑÑеÑÑвенно, ÑÐ°ÐºÐ°Ñ ÑÑÑока должна вклÑÑаÑÑ Ð² ÑÐµÐ±Ñ Ð²Ñе важнÑе ÑвойÑÑва.
ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ ÑеализоваÑÑ Ð¿ÑеобÑазование ÑледÑÑÑим обÑазом:
let user = {
name: "John",
age: 30,
toString() {
return `{name: "${this.name}", age: ${this.age}}`;
}
};
alert(user); // {name: "John", age: 30}
â¦Ðо в пÑоÑеÑÑе ÑазÑабоÑки добавлÑÑÑÑÑ Ð½Ð¾Ð²Ñе ÑвойÑÑва, ÑÑаÑÑе ÑвойÑÑва пеÑеименовÑваÑÑÑÑ Ð¸ ÑдалÑÑÑÑÑ. Ðбновление Ñакого toString каждÑй Ñаз Ð¼Ð¾Ð¶ÐµÑ ÑÑаÑÑ Ð¿Ñоблемой. ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð¿Ð¾Ð¿ÑÑаÑÑÑÑ Ð¿ÐµÑебÑаÑÑ ÑвойÑÑва в нÑм, но ÑÑо, еÑли обÑÐµÐºÑ ÑложнÑй, и в его ÑвойÑÑваÑ
имеÑÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе обÑекÑÑ? ÐÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±Ñли Ð±Ñ Ð¾ÑÑÑеÑÑвиÑÑ Ð¸Ñ
пÑеобÑазование Ñоже.
Ð ÑÑаÑÑÑÑ, Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи пиÑаÑÑ ÐºÐ¾Ð´ Ð´Ð»Ñ Ð¾Ð±ÑабоÑки вÑего ÑÑого. У задаÑи еÑÑÑ Ð¿ÑоÑÑое ÑеÑение.
JSON.stringify
JSON (JavaScript Object Notation) â ÑÑо обÑий ÑоÑÐ¼Ð°Ñ Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений и обÑекÑов. Ðго опиÑание задокÑменÑиÑовано в ÑÑандаÑÑе RFC 4627. ÐеÑвонаÑалÑно он бÑл Ñоздан Ð´Ð»Ñ JavaScript, но многие дÑÑгие ÑзÑки Ñакже имеÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки, коÑоÑÑе могÑÑ ÑабоÑаÑÑ Ñ Ð½Ð¸Ð¼. Таким обÑазом, JSON легко иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° даннÑми, когда ÐºÐ»Ð¸ÐµÐ½Ñ Ð¸ÑполÑзÑÐµÑ JavaScript, а ÑеÑÐ²ÐµÑ Ð½Ð°Ð¿Ð¸Ñан на Ruby/PHP/Java или лÑбом дÑÑгом ÑзÑке.
JavaScript пÑедоÑÑавлÑÐµÑ Ð¼ÐµÑодÑ:
JSON.stringifyÐ´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов в JSON.JSON.parseÐ´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ JSON обÑаÑно в обÑекÑ.
ÐапÑимеÑ, здеÑÑ Ð¼Ñ Ð¿ÑеобÑазÑем ÑеÑез JSON.stringify даннÑе ÑÑÑденÑа:
let student = {
name: 'John',
age: 30,
isAdmin: false,
courses: ['html', 'css', 'js'],
wife: null
};
let json = JSON.stringify(student);
alert(typeof json); // Ð¼Ñ Ð¿Ð¾Ð»ÑÑили ÑÑÑокÑ!
alert(json);
/* вÑÐ²ÐµÐ´ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð² ÑоÑмаÑе JSON:
{
"name": "John",
"age": 30,
"isAdmin": false,
"courses": ["html", "css", "js"],
"wife": null
}
*/
ÐеÑод JSON.stringify(student) беÑÑÑ Ð¾Ð±ÑÐµÐºÑ Ð¸ пÑеобÑазÑÐµÑ ÐµÐ³Ð¾ в ÑÑÑокÑ.
ÐолÑÑÐµÐ½Ð½Ð°Ñ ÑÑÑока json назÑваеÑÑÑ JSON-ÑоÑмаÑиÑованнÑм или ÑеÑиализованнÑм обÑекÑом. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ оÑпÑавиÑÑ ÐµÐ³Ð¾ по ÑеÑи или помеÑÑиÑÑ Ð² обÑÑное Ñ
ÑанилиÑе даннÑÑ
.
ÐбÑаÑиÑе внимание, ÑÑо обÑÐµÐºÑ Ð² ÑоÑмаÑе JSON Ð¸Ð¼ÐµÐµÑ Ð½ÐµÑколÑко важнÑÑ Ð¾ÑлиÑий Ð¾Ñ Ð¾Ð±ÑекÑного лиÑеÑала:
- СÑÑоки иÑполÑзÑÑÑ Ð´Ð²Ð¾Ð¹Ð½Ñе кавÑÑки. ÐикакиÑ
одинаÑнÑÑ
кавÑÑек или обÑаÑнÑÑ
кавÑÑек в JSON. Так
'John'ÑÑановиÑÑÑ"John". - Ðмена ÑвойÑÑв обÑекÑа Ñакже заклÑÑаÑÑÑÑ Ð² двойнÑе кавÑÑки. ÐÑо обÑзаÑелÑно. Так
age:30ÑÑановиÑÑÑ"age":30.
JSON.stringify Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑименÑн и к пÑимиÑивам.
JSON поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑледÑÑÑие ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ :
- ÐбÑекÑÑ
{ ... } - ÐаÑÑивÑ
[ ... ] - ÐÑимиÑивÑ:
- ÑÑÑоки,
- ÑиÑла,
- логиÑеÑкие знаÑениÑ
true/false, null.
ÐапÑимеÑ:
// ÑиÑло в JSON оÑÑаÑÑÑÑ ÑиÑлом
alert( JSON.stringify(1) ) // 1
// ÑÑÑока в JSON по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð¾ÑÑаÑÑÑÑ ÑÑÑокой, но в двойнÑÑ
кавÑÑкаÑ
alert( JSON.stringify('test') ) // "test"
alert( JSON.stringify(true) ); // true
alert( JSON.stringify([1, 2, 3]) ); // [1,2,3]
JSON ÑвлÑеÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимой Ð¾Ñ ÑзÑка ÑпеÑиÑикаÑией Ð´Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
, поÑÑÐ¾Ð¼Ñ JSON.stringify пÑопÑÑÐºÐ°ÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑе ÑпеÑиÑиÑеÑкие ÑвойÑÑва обÑекÑов JavaScript.
Рименно:
- СвойÑÑва-ÑÑнкÑии (меÑодÑ).
- СимволÑнÑе клÑÑи и знаÑениÑ.
- СвойÑÑва, ÑодеÑжаÑие
undefined.
let user = {
sayHi() { // бÑÐ´ÐµÑ Ð¿ÑопÑÑено
alert("Hello");
},
[Symbol("id")]: 123, // Ñакже бÑÐ´ÐµÑ Ð¿ÑопÑÑено
something: undefined // как и ÑÑо - пÑопÑÑено
};
alert( JSON.stringify(user) ); // {} (пÑÑÑой обÑекÑ)
ÐбÑÑно ÑÑо ноÑмалÑно. ÐÑли ÑÑо не Ñо, Ñего Ð¼Ñ Ñ Ð¾Ñим, Ñо ÑкоÑо Ð¼Ñ Ñвидим, как можно наÑÑÑоиÑÑ ÑÑÐ¾Ñ Ð¿ÑоÑеÑÑ.
Самое замеÑаÑелÑное, ÑÑо вложеннÑе обÑекÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ Ð¸ конвеÑÑиÑÑÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки.
ÐапÑимеÑ:
let meetup = {
title: "Conference",
room: {
number: 23,
participants: ["john", "ann"]
}
};
alert( JSON.stringify(meetup) );
/* вÑÑ ÑÑÑÑкÑÑÑа пÑеобÑазована в ÑÑÑокÑ:
{
"title":"Conference",
"room":{"number":23,"participants":["john","ann"]},
}
*/
Ðажное огÑаниÑение: не должно бÑÑÑ ÑиклиÑеÑÐºÐ¸Ñ ÑÑÑлок.
ÐапÑимеÑ:
let room = {
number: 23
};
let meetup = {
title: "Conference",
participants: ["john", "ann"]
};
meetup.place = room; // meetup ÑÑÑлаеÑÑÑ Ð½Ð° room
room.occupiedBy = meetup; // room ÑÑÑлаеÑÑÑ Ð½Ð° meetup
JSON.stringify(meetup); // ÐÑибка: ÐÑеобÑазование ÑиклиÑной ÑÑÑÑкÑÑÑÑ Ð² JSON
ÐдеÑÑ Ð¿ÑеобÑазование завеÑÑаеÑÑÑ Ð½ÐµÑдаÑно из-за ÑиклиÑеÑкой ÑÑÑлки: room.occupiedBy ÑÑÑлаеÑÑÑ Ð½Ð° meetup, и meetup.place ÑÑÑлаеÑÑÑ Ð½Ð° room:
ÐÑклÑÑаем и пÑеобÑазÑем: replacer
ÐолнÑй ÑинÑакÑÐ¸Ñ JSON.stringify:
let json = JSON.stringify(value[, replacer, space])
- value
- ÐнаÑение Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸ÑованиÑ.
- replacer
- ÐаÑÑив ÑвойÑÑв Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ ÑÑнкÑÐ¸Ñ ÑооÑвеÑÑÑвиÑ
function(key, value). - space
- ÐополниÑелÑное пÑоÑÑÑанÑÑво (оÑÑÑÑпÑ), иÑполÑзÑемое Ð´Ð»Ñ ÑоÑмаÑиÑованиÑ.
РболÑÑинÑÑве ÑлÑÑаев JSON.stringify иÑполÑзÑеÑÑÑ ÑолÑко Ñ Ð¿ÐµÑвÑм аÑгÑменÑом. Ðо еÑли нам нÑжно наÑÑÑоиÑÑ Ð¿ÑоÑеÑÑ Ð·Ð°Ð¼ÐµÐ½Ñ, напÑимеÑ, оÑÑилÑÑÑоваÑÑ ÑиклиÑеÑкие ÑÑÑлки, Ñо можно иÑполÑзоваÑÑ Ð²ÑоÑой аÑгÑÐ¼ÐµÐ½Ñ JSON.stringify.
ÐÑли Ð¼Ñ Ð¿ÐµÑедадим ÐµÐ¼Ñ Ð¼Ð°ÑÑив ÑвойÑÑв, бÑдÑÑ Ð·Ð°ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²Ð°Ð½Ñ ÑолÑко ÑÑи ÑвойÑÑва.
ÐапÑимеÑ:
let room = {
number: 23
};
let meetup = {
title: "Conference",
participants: [{name: "John"}, {name: "Alice"}],
place: room // meetup ÑÑÑлаеÑÑÑ Ð½Ð° room
};
room.occupiedBy = meetup; // room ÑÑÑлаеÑÑÑ Ð½Ð° meetup
alert( JSON.stringify(meetup, ['title', 'participants']) );
// {"title":"Conference","participants":[{},{}]}
ÐдеÑÑ Ð¼Ñ, навеÑное, ÑлиÑком ÑÑÑоги. СпиÑок ÑвойÑÑв пÑименÑеÑÑÑ ÐºÐ¾ вÑей ÑÑÑÑкÑÑÑе обÑекÑа. Так ÑÑо внÑÑÑи participants â пÑÑÑÑе обÑекÑÑ, поÑÐ¾Ð¼Ñ ÑÑо name Ð½ÐµÑ Ð² ÑпиÑке.
ÐавайÑе вклÑÑим в ÑпиÑок вÑе ÑвойÑÑва, кÑоме room.occupiedBy, из-за коÑоÑого поÑвлÑеÑÑÑ ÑиклиÑÐ½Ð°Ñ ÑÑÑлка:
let room = {
number: 23
};
let meetup = {
title: "Conference",
participants: [{name: "John"}, {name: "Alice"}],
place: room // meetup ÑÑÑлаеÑÑÑ Ð½Ð° room
};
room.occupiedBy = meetup; // room ÑÑÑлаеÑÑÑ Ð½Ð° meetup
alert( JSON.stringify(meetup, ['title', 'participants', 'place', 'name', 'number']) );
/*
{
"title":"Conference",
"participants":[{"name":"John"},{"name":"Alice"}],
"place":{"number":23}
}
*/
ТепеÑÑ Ð²ÑÑ, кÑоме occupiedBy, ÑеÑиализовано. Ðо ÑпиÑок ÑвойÑÑв доволÑно длиннÑй.
Ð ÑÑаÑÑÑÑ, в каÑеÑÑве replacer Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÑÑнкÑиÑ, а не маÑÑив.
ФÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ паÑÑ (key, value), и она должна возвÑаÑаÑÑ Ð·Ð°Ð¼ÐµÐ½Ñнное знаÑение, коÑоÑое бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð²Ð¼ÐµÑÑо иÑÑ
одного. Ðли undefined, ÑÑÐ¾Ð±Ñ Ð¿ÑопÑÑÑиÑÑ Ð·Ð½Ð°Ñение.
РнаÑем ÑлÑÑае Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ веÑнÑÑÑ value «как еÑÑÑ» Ð´Ð»Ñ Ð²Ñего, кÑоме occupiedBy. ЧÑÐ¾Ð±Ñ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑ occupiedBy, код ниже возвÑаÑÐ°ÐµÑ undefined:
let room = {
number: 23
};
let meetup = {
title: "Conference",
participants: [{name: "John"}, {name: "Alice"}],
place: room // meetup ÑÑÑлаеÑÑÑ Ð½Ð° room
};
room.occupiedBy = meetup; // room ÑÑÑлаеÑÑÑ Ð½Ð° meetup
alert( JSON.stringify(meetup, function replacer(key, value) {
alert(`${key}: ${value}`);
return (key == 'occupiedBy') ? undefined : value;
}));
/* паÑÑ ÐºÐ»ÑÑ:знаÑение, коÑоÑÑе пÑиÑ
одÑÑ Ð² replacer:
: [object Object]
title: Conference
participants: [object Object],[object Object]
0: [object Object]
name: John
1: [object Object]
name: Alice
place: [object Object]
number: 23
occupiedBy: [object Object]
*/
ÐбÑаÑиÑе внимание, ÑÑо ÑÑнкÑÐ¸Ñ replacer полÑÑÐ°ÐµÑ ÐºÐ°Ð¶Ð´ÑÑ Ð¿Ð°ÑÑ ÐºÐ»ÑÑ/знаÑение, вклÑÑÐ°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе обÑекÑÑ Ð¸ ÑлеменÑÑ Ð¼Ð°ÑÑива. Рона пÑименÑеÑÑÑ ÑекÑÑÑивно. ÐнаÑение this внÑÑÑи replacer â ÑÑо обÑекÑ, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ ÑекÑÑее ÑвойÑÑво.
ÐеÑвÑй вÑзов â оÑобеннÑй. ÐÐ¼Ñ Ð¿ÐµÑедаÑÑÑÑ ÑпеÑиалÑнÑй «обÑекÑ-обÑÑÑка»: {"": meetup}. ÐÑÑгими Ñловами, пеÑÐ²Ð°Ñ (key, value) паÑа Ð¸Ð¼ÐµÐµÑ Ð¿ÑÑÑой клÑÑ, а знаÑением ÑвлÑеÑÑÑ Ñелевой обÑÐµÐºÑ Ð² обÑем. ÐÐ¾Ñ Ð¿Ð¾ÑÐµÐ¼Ñ Ð¿ÐµÑÐ²Ð°Ñ ÑÑÑока из пÑимеÑа вÑÑе бÑÐ´ÐµÑ ":[object Object]".
ÐÐ´ÐµÑ ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑÐ¾Ð±Ñ Ð´Ð°ÑÑ ÐºÐ°Ðº можно болÑÑе возможноÑÑей replacer â Ñ Ð½ÐµÐ³Ð¾ еÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿ÑоанализиÑоваÑÑ Ð¸ замениÑÑ/пÑопÑÑÑиÑÑ Ð´Ð°Ð¶Ðµ веÑÑ Ð¾Ð±ÑÐµÐºÑ Ñеликом, еÑли ÑÑо необÑ
одимо.
ФоÑмаÑиÑование: space
ТÑеÑий аÑгÑÐ¼ÐµÐ½Ñ Ð² JSON.stringify(value, replacer, space) â ÑÑо колиÑеÑÑво пÑобелов, иÑполÑзÑемÑÑ
Ð´Ð»Ñ Ñдобного ÑоÑмаÑиÑованиÑ.
Ранее вÑе JSON-ÑоÑмаÑиÑованнÑе обÑекÑÑ Ð½Ðµ имели оÑÑÑÑпов и лиÑниÑ
пÑобелов. ÐÑо ноÑмалÑно, еÑли Ð¼Ñ Ñ
оÑим оÑпÑавиÑÑ Ð¾Ð±ÑÐµÐºÑ Ð¿Ð¾ ÑеÑи. ÐÑгÑÐ¼ÐµÐ½Ñ space иÑполÑзÑеÑÑÑ Ð¸ÑклÑÑиÑелÑно Ð´Ð»Ñ Ð²Ñвода в ÑдобоÑиÑаемом виде.
Ðиже space = 2 ÑказÑÐ²Ð°ÐµÑ JavaScript оÑобÑажаÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе обÑекÑÑ Ð² неÑколÑко ÑÑÑок Ñ Ð¾ÑÑÑÑпом в 2 пÑобела внÑÑÑи обÑекÑа:
let user = {
name: "John",
age: 25,
roles: {
isAdmin: false,
isEditor: true
}
};
alert(JSON.stringify(user, null, 2));
/* оÑÑÑÑп в 2 пÑобела:
{
"name": "John",
"age": 25,
"roles": {
"isAdmin": false,
"isEditor": true
}
}
*/
/* Ð´Ð»Ñ JSON.stringify(user, null, 4) ÑезÑлÑÑÐ°Ñ ÑодеÑÐ¶Ð¸Ñ Ð±Ð¾Ð»ÑÑе оÑÑÑÑпов:
{
"name": "John",
"age": 25,
"roles": {
"isAdmin": false,
"isEditor": true
}
}
*/
ТÑеÑÑим аÑгÑменÑом Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑока. Ð ÑÑом ÑлÑÑае ÑÑÑока бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¾ÑÑÑÑпа вмеÑÑо ÑÑда пÑобелов.
ÐаÑамеÑÑ space пÑименÑеÑÑÑ Ð¸ÑклÑÑиÑелÑно Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ кÑаÑивого вÑвода.
ÐолÑзоваÑелÑÑкий «toJSON»
Ðак и toString Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑÑок, обÑÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавлÑÑÑ Ð¼ÐµÑод toJSON Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² JSON. JSON.stringify авÑомаÑиÑеÑки вÑзÑÐ²Ð°ÐµÑ ÐµÐ³Ð¾, еÑли он еÑÑÑ.
ÐапÑимеÑ:
let room = {
number: 23
};
let meetup = {
title: "Conference",
date: new Date(Date.UTC(2017, 0, 1)),
room
};
alert( JSON.stringify(meetup) );
/*
{
"title":"Conference",
"date":"2017-01-01T00:00:00.000Z", // (1)
"room": {"number":23} // (2)
}
*/
Ðак видим, date (1) ÑÑал ÑÑÑокой. ÐÑо поÑомÑ, ÑÑо вÑе обÑекÑÑ Ñипа Date имеÑÑ Ð²ÑÑÑоеннÑй меÑод toJSON, коÑоÑÑй возвÑаÑÐ°ÐµÑ ÑакÑÑ ÑÑÑокÑ.
ТепеÑÑ Ð´Ð°Ð²Ð°Ð¹Ñе добавим ÑобÑÑвеннÑÑ ÑеализаÑÐ¸Ñ Ð¼ÐµÑода toJSON в Ð½Ð°Ñ Ð¾Ð±ÑÐµÐºÑ room (2):
let room = {
number: 23,
toJSON() {
return this.number;
}
};
let meetup = {
title: "Conference",
room
};
alert( JSON.stringify(room) ); // 23
alert( JSON.stringify(meetup) );
/*
{
"title":"Conference",
"room": 23
}
*/
Ðак видиÑе, toJSON иÑполÑзÑеÑÑÑ ÐºÐ°Ðº пÑи пÑÑмом вÑзове JSON.stringify(room), Ñак и когда room вложен в дÑÑгой ÑеÑиализÑемÑй обÑекÑ.
JSON.parse
ЧÑÐ¾Ð±Ñ Ð´ÐµÐºÐ¾Ð´Ð¸ÑоваÑÑ JSON-ÑÑÑокÑ, нам нÑжен дÑÑгой меÑод Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ JSON.parse.
СинÑакÑиÑ:
let value = JSON.parse(str[, reviver]);
- str
- JSON Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² обÑекÑ.
- reviver
- ÐеобÑзаÑелÑÐ½Ð°Ñ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ паÑÑ
(клÑÑ, знаÑение)и Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑеобÑазовÑваÑÑ Ð·Ð½Ð°Ñение.
ÐапÑимеÑ:
// ÑÑÑоковÑй маÑÑив
let numbers = "[0, 1, 2, 3]";
numbers = JSON.parse(numbers);
alert( numbers[1] ); // 1
Ðли Ð´Ð»Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½ÑÑ Ð¾Ð±ÑекÑов:
let user = '{ "name": "John", "age": 35, "isAdmin": false, "friends": [0,1,2,3] }';
user = JSON.parse(user);
alert( user.friends[1] ); // 1
JSON Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°ÑÑолÑко ÑложнÑм, наÑколÑко ÑÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾, обÑекÑÑ Ð¸ маÑÑÐ¸Ð²Ñ Ð¼Ð¾Ð³ÑÑ Ð²ÐºÐ»ÑÑаÑÑ Ð´ÑÑгие обÑекÑÑ Ð¸ маÑÑивÑ. Ðо они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð² Ñом же JSON-ÑоÑмаÑе.
ÐÐ¾Ñ ÑипиÑнÑе оÑибки в напиÑанном Ð¾Ñ ÑÑки JSON (иногда пÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑÑ Ð¿Ð¸ÑаÑÑ ÐµÐ³Ð¾ Ð´Ð»Ñ Ð¾Ñладки):
let json = `{
name: "John", // ÐÑибка: Ð¸Ð¼Ñ ÑвойÑÑва без кавÑÑек
"surname": 'Smith', // ÐÑибка: одинаÑнÑе кавÑÑки в знаÑении (Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð´Ð²Ð¾Ð¹Ð½Ñми)
'isAdmin': false, // ÐÑибка: одинаÑнÑе кавÑÑки в клÑÑе (Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð´Ð²Ð¾Ð¹Ð½Ñми)
"birthday": new Date(2000, 2, 3), // ÐÑибка: не допÑÑкаеÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ "new", ÑолÑко знаÑениÑ
"gender": "male" // ÐÑибка: оÑÑÑÑÑÑвÑÐµÑ Ð·Ð°Ð¿ÑÑÐ°Ñ Ð¿Ð¾Ñле непоÑледнего ÑвойÑÑва
"friends": [0,1,2,3], // ÐÑибка: не должно бÑÑÑ Ð·Ð°Ð¿ÑÑой поÑле поÑледнего ÑвойÑÑва
}`;
ÐÑоме Ñого, JSON не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑии. Ðобавление комменÑаÑÐ¸Ñ Ð² JSON Ð´ÐµÐ»Ð°ÐµÑ ÐµÐ³Ð¾ недейÑÑвиÑелÑнÑм.
СÑÑеÑÑвÑÐµÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ ÑоÑÐ¼Ð°Ñ JSON5, коÑоÑÑй поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÐºÐ»ÑÑи без кавÑÑек, комменÑаÑии и Ñ.д. Ðо ÑÑо ÑамоÑÑоÑÑелÑÐ½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека, а не ÑпеÑиÑикаÑÐ¸Ñ ÑзÑка.
ÐбÑÑнÑй JSON наÑÑолÑко ÑÑÑог не поÑомÑ, ÑÑо его ÑазÑабоÑÑики ленивÑ, а поÑомÑ, ÑÑо позволÑÐµÑ Ð»ÐµÐ³ÐºÐ¾, надÑжно и оÑÐµÐ½Ñ Ð±ÑÑÑÑо ÑеализовÑваÑÑ Ð°Ð»Ð³Ð¾ÑиÑм кодиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑÑениÑ.
ÐÑполÑзование reviver
ÐÑедÑÑавÑÑе, ÑÑо Ð¼Ñ Ð¿Ð¾Ð»ÑÑили обÑÐµÐºÑ meetup Ñ ÑеÑвеÑа в виде ÑÑÑоки даннÑÑ
.
ÐÐ¾Ñ Ñакой:
// title: (meetup title), date: (meetup date)
let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
â¦Ð ÑепеÑÑ Ð½Ð°Ð¼ нÑжно деÑеÑиализоваÑÑ ÐµÑ, Ñ.е. Ñнова пÑевÑаÑиÑÑ Ð² обÑÐµÐºÑ JavaScript.
ÐавайÑе Ñделаем ÑÑо, вÑзвав JSON.parse:
let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
let meetup = JSON.parse(str);
alert( meetup.date.getDate() ); // ÐÑибка!
Ðй, оÑибка!
ÐнаÑением meetup.date ÑвлÑеÑÑÑ ÑÑÑока, а не Date обÑекÑ. Ðак JSON.parse мог знаÑÑ, ÑÑо он должен бÑл пÑеобÑазоваÑÑ ÑÑÑ ÑÑÑÐ¾ÐºÑ Ð² Date?
ÐавайÑе пеÑедадим JSON.parse ÑÑнкÑÐ¸Ñ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÑоÑÑм аÑгÑменÑом, коÑоÑÐ°Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð²Ñе знаÑÐµÐ½Ð¸Ñ Â«ÐºÐ°Ðº еÑÑÑ», но date ÑÑÐ°Ð½ÐµÑ Date:
let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
let meetup = JSON.parse(str, function(key, value) {
if (key == 'date') return new Date(value);
return value;
});
alert( meetup.date.getDate() ); // 30 - ÑепеÑÑ ÑабоÑаеÑ!
ÐÑÑаÑи, ÑÑо ÑабоÑÐ°ÐµÑ Ð¸ Ð´Ð»Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½ÑÑ Ð¾Ð±ÑекÑов:
let schedule = `{
"meetups": [
{"title":"Conference","date":"2017-11-30T12:00:00.000Z"},
{"title":"Birthday","date":"2017-04-18T12:00:00.000Z"}
]
}`;
schedule = JSON.parse(schedule, function(key, value) {
if (key == 'date') return new Date(value);
return value;
});
alert( schedule.meetups[1].date.getDate() ); // 18 - оÑлиÑно!
ÐÑого
- JSON â ÑÑо ÑоÑÐ¼Ð°Ñ Ð´Ð°Ð½Ð½ÑÑ , коÑоÑÑй Ð¸Ð¼ÐµÐµÑ ÑобÑÑвеннÑй незавиÑимÑй ÑÑандаÑÑ Ð¸ библиоÑеки Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва ÑзÑков пÑогÑаммиÑованиÑ.
- JSON поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿ÑоÑÑÑе обÑекÑÑ, маÑÑивÑ, ÑÑÑоки, ÑиÑла, логиÑеÑкие знаÑÐµÐ½Ð¸Ñ Ð¸
null. - JavaScript пÑедоÑÑавлÑÐµÑ Ð¼ÐµÑÐ¾Ð´Ñ JSON.stringify Ð´Ð»Ñ ÑеÑиализаÑии в JSON и JSON.parse Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð¸Ð· JSON.
- Ðба меÑода поддеÑживаÑÑ ÑÑнкÑии пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð½ÑеллекÑÑалÑного ÑÑениÑ/запиÑи.
- ÐÑли обÑÐµÐºÑ Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑод
toJSON, Ñо он вÑзÑваеÑÑÑ ÑеÑезJSON.stringify.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)