СкажÑмо, Ñ Ð½Ð°Ñ Ñ Ñкладний обâÑкÑ, Ñ Ð¼Ð¸ Ñ Ð¾ÑÑли б пеÑеÑвоÑиÑи його в ÑÑдок, Ñоб вÑдпÑавиÑи його ÑеÑез меÑÐµÐ¶Ñ Ð°Ð±Ð¾ пÑоÑÑо вивеÑÑи його Ð´Ð»Ñ Ð»Ð¾Ð³ÑваннÑ.
ÐезÑмовно, Ñакий ÑÑдок повинен вклÑÑаÑи вÑÑ Ð²Ð°Ð¶Ð»Ð¸Ð²Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ.
Ðи могли б ÑеалÑзÑваÑи пеÑеÑвоÑÐµÐ½Ð½Ñ Ð½Ð°ÑÑÑпним Ñином:
let user = {
name: "Ðван",
age: 30,
toString() {
return `{name: "${this.name}", age: ${this.age}}`;
}
};
alert(user); // {name: "Ðван", age: 30}
⦠Ðле в пÑоÑеÑÑ ÑозÑобки додаÑÑÑÑÑ Ð½Ð¾Ð²Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ, ÑÑаÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð¿ÐµÑейменовÑÑÑÑÑÑ Ñа видалÑÑÑÑÑÑ. ÐÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñакого toString кожен Ñаз може ÑÑаÑи пÑоблемоÑ. Ðи могли б ÑпÑобÑваÑи пеÑебÑаÑи влаÑÑивоÑÑÑ Ð² нÑомÑ, але Ñо, ÑкÑо обâÑÐºÑ Ñ Ñкладним Ñ Ð² його влаÑÑивоÑÑÑÑ
Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ Ð¾Ð±âÑкÑи? Ðи Ñакож Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ ÑеалÑзÑваÑи ÑÑ
пеÑеÑвоÑеннÑ.
Ðа ÑаÑÑÑ, нема поÑÑеби пиÑаÑи код Ð´Ð»Ñ Ð¾Ð±Ñобки вÑÑого ÑÑого. У ÑÑго Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ñ Ð¿ÑоÑÑе ÑÑÑеннÑ.
JSON.stringify
JSON (JavaScript Object Notation) â Ñе загалÑний ÑоÑмаÑ, Ñкий пÑедÑÑавлÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ñа обâÑкÑи. ÐÑн опиÑÑÑÑÑÑÑ Ñ ÑÑандаÑÑÑ RFC 4627. СпоÑаÑÐºÑ Ð²Ñн бÑв ÑозÑоблений Ð´Ð»Ñ JavaScript, але багаÑо ÑнÑÐ¸Ñ Ð¼Ð¾Ð² маÑÑÑ Ð±ÑблÑоÑеки, Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ обÑобки. Ð¢Ð¾Ð¼Ñ Ð»ÐµÐ³ÐºÐ¾ викоÑиÑÑовÑваÑи JSON Ð´Ð»Ñ Ð¾Ð±Ð¼ÑÐ½Ñ Ð´Ð°Ð½Ð¸Ð¼Ð¸, коли клÑÑÐ½Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑ JavaScript, а ÑеÑÐ²ÐµÑ Ð½Ð°Ð¿Ð¸Ñаний на Ruby/PHP/Java ÑоÑо.
JavaScript Ð½Ð°Ð´Ð°Ñ Ð¼ÐµÑоди:
JSON.stringifyÐ´Ð»Ñ Ð¿ÐµÑеÑвоÑÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑÑв в JSON (вÑн повеÑÑÐ°Ñ JSON-ÑÑдок).JSON.parseÐ´Ð»Ñ Ð¿ÐµÑеÑвоÑÐµÐ½Ð½Ñ JSON-ÑÑдка назад в обâÑкÑ.
ÐапÑиклад, ÑÑÑ Ð¼Ð¸ ÑÑанÑÑоÑмÑÑмо Ð´Ð°Ð½Ñ ÑÑÑденÑа за Ð´Ð¾Ð¼Ð¾Ð³Ð¾Ñ JSON.stringify:
let student = {
name: 'Ðван',
age: 30,
isAdmin: false,
courses: ['html', 'css', 'js'],
spouse: null
};
let json = JSON.stringify(student);
alert(typeof json); // ми оÑÑимали ÑÑдок!
alert(json);
/* JSON-кодований обâÑкÑ:
{
"name": "Ðван",
"age": 30,
"isAdmin": false,
"courses": ["html", "css", "js"],
"spouse": null
}
*/
ÐеÑод JSON.stringify(student) беÑе обâÑÐºÑ Ñ Ð¿ÐµÑеÑвоÑÑÑ Ð¹Ð¾Ð³Ð¾ в ÑÑдок.
ÐÑÑиманий json ÑÑдок називаÑÑÑÑÑ JSON-кодованим або ÑеÑÑалÑзованим обâÑкÑом. Ðи гоÑÐ¾Ð²Ñ Ð²ÑдпÑавиÑи його по меÑÐµÐ¶Ñ Ð°Ð±Ð¾ поклаÑÑи в звиÑайне ÑÑ
овиÑе даниÑ
.
ÐÑÐ´Ñ Ð»Ð°Ñка, звеÑнÑÑÑ ÑвагÑ, Ñо JSON-кодований обâÑÐºÑ Ð¼Ð°Ñ ÐºÑлÑка Ð²Ð°Ð¶Ð»Ð¸Ð²Ð¸Ñ Ð²ÑдмÑнноÑÑей вÑд лÑÑеÑалÑного обâÑкÑа:
- Ð Ñдки викоÑиÑÑовÑÑÑÑ Ð¿Ð¾Ð´Ð²ÑÐ¹Ð½Ñ Ð»Ð°Ð¿ÐºÐ¸. ÐÑÑкиÑ
одинаÑниÑ
або звоÑоÑнÑÑ
лапок Ñ JSON. ТобÑо
'Ðван'ÑÑаÑ"Ðван". - Ðазви влаÑÑивоÑÑей обâÑкÑа Ñакож обеÑÑаÑÑÑÑÑ Ð² подвÑÐ¹Ð½Ñ Ð»Ð°Ð¿ÐºÐ¸. Це обовâÑзково. ТобÑо
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("ÐÑивÑÑ");
},
[Symbol("id")]: 123, // ÑгноÑÑÑÑÑÑÑ
something: undefined // ÑгноÑÑÑÑÑÑÑ
};
alert( JSON.stringify(user) ); // {} (поÑожнÑй обâÑкÑ)
ÐазвиÑай Ñе добÑе. ЯкÑо Ñе не Ñе, Ñого ми Ñ Ð¾Ñемо, Ñо ÑкоÑо ми побаÑимо, Ñк налаÑÑÑваÑи пÑоÑеÑ.
ЧÑдово, Ñо Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ Ð¾Ð±âÑкÑи пÑдÑÑимÑÑÑÑÑÑ Ñа пеÑеÑвоÑÑÑÑÑÑÑ Ð°Ð²ÑомаÑиÑно.
ÐапÑиклад:
let meetup = {
title: "ÐонÑеÑенÑÑÑ",
room: {
number: 23,
participants: ["Ðван", "Ðнна"]
}
};
alert( JSON.stringify(meetup) );
/* ÐÑÑ ÑÑÑÑкÑÑÑа пеÑеÑвоÑена на ÑÑдок:
{
"title":"ÐонÑеÑенÑÑÑ",
"room":{"number":23,"participants":["Ðван","Ðнна"]},
}
*/
ÐÐ°Ð¶Ð»Ð¸Ð²Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ: не повинно бÑÑи Ð¶Ð¾Ð´Ð½Ð¸Ñ ÑиклÑÑÐ½Ð¸Ñ Ð¿Ð¾ÑиланÑ.
ÐапÑиклад:
let room = {
number: 23
};
let meetup = {
title: "ÐонÑеÑенÑÑÑ",
participants: ["Ðван", "Ðнна"]
};
meetup.place = room; // meetup поÑилаÑÑÑÑÑ Ð½Ð° room
room.occupiedBy = meetup; // room поÑилаÑÑÑÑÑ Ð½Ð° meetup
JSON.stringify(meetup); // Ðомилка: ÐонвеÑÑÑÐ²Ð°Ð½Ð½Ñ ÑиклÑÑниÑ
ÑÑÑÑкÑÑÑ Ð² JSON
ТÑÑ Ð¿ÐµÑеÑвоÑÐµÐ½Ð½Ñ Ð½Ðµ вдаÑÑÑÑÑ ÑеÑез ÑиклÑÑÐ½Ñ Ð¿Ð¾ÑиланнÑ: room.occupiedBy, Ñке поÑилаÑÑÑÑÑ Ð½Ð° meetup, Ñ metup.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: "ÐонÑеÑенÑÑÑ",
participants: [{name: "Ðван"}, {name: "ÐлÑна"}],
place: room // meetup поÑилаÑÑÑÑÑ Ð½Ð° room
};
room.occupiedBy = meetup; // room поÑилаÑÑÑÑÑ Ð½Ð° meetup
alert( JSON.stringify(meetup, ['title', 'participants']) );
// {"title":"ÐонÑеÑенÑÑÑ","participants":[{},{}]}
ТÑÑ Ð¼Ð¸, мабÑÑÑ, занадÑо ÑÑвоÑÑ. СпиÑок влаÑÑивоÑÑей заÑÑоÑовÑÑÑÑÑÑ Ð´Ð¾ вÑÑÑÑ ÑÑÑÑкÑÑÑи обâÑкÑа. Ð¢Ð¾Ð¼Ñ Ð¾Ð±âÑкÑи в participants бÑдÑÑÑ Ð¿Ð¾ÑожнÑми, бо name Ð½ÐµÐ¼Ð°Ñ Ð² ÑпиÑкÑ.
ÐклÑÑÑмо в ÑпиÑок вÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ, окÑÑм room.occupiedBy, Ñка пÑизводиÑÑ Ð´Ð¾ ÑиклÑÑного поÑиланнÑ:
let room = {
number: 23
};
let meetup = {
title: "ÐонÑеÑенÑÑÑ",
participants: [{name: "Ðван"}, {name: "ÐлÑна"}],
place: room // meetup поÑилаÑÑÑÑÑ Ð½Ð° room
};
room.occupiedBy = meetup; // room поÑилаÑÑÑÑÑ Ð½Ð° meetup
alert( JSON.stringify(meetup, ['title', 'participants', 'place', 'name', 'number']) );
/*
{
"title":"ÐонÑеÑенÑÑÑ",
"participants":[{"name":"Ðван"},{"name":"ÐлÑна"}],
"place":{"number":23}
}
*/
Ð¢ÐµÐ¿ÐµÑ Ð²Ñе, кÑÑм occupiedBy, ÑеÑÑалÑзÑÑÑÑÑÑ. Ðле ÑпиÑок влаÑÑивоÑÑей доÑиÑÑ Ð´Ð¾Ð²Ð³Ð¸Ð¹.
Ðа ÑаÑÑÑ, в ÑкоÑÑÑ replacer ми можемо викоÑиÑÑовÑваÑи ÑÑнкÑÑÑ Ð·Ð°Ð¼ÑÑÑÑ Ð¼Ð°ÑивÑ.
ФÑнкÑÑÑ Ð±Ñде викликана Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ (key, value), Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° повеÑнÑÑи замÑнене знаÑеннÑ, Ñке бÑде викоÑиÑÑовÑваÑиÑÑ Ð·Ð°Ð¼ÑÑÑÑ Ð¾ÑигÑналÑного. Ðбо undefined, ÑкÑо знаÑÐµÐ½Ð½Ñ Ð±Ñде пÑопÑÑено.
У наÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð¼Ð¸ можемо повеÑнÑÑи value âÑк Ñâ Ð´Ð»Ñ Ð²ÑÑого, кÑÑм occupiedBy. Щоб ÑгноÑÑваÑи occupiedBy, код нижÑе повеÑÑÐ°Ñ undefined:
let room = {
number: 23
};
let meetup = {
title: "ÐонÑеÑенÑÑÑ",
participants: [{name: "Ðван"}, {name: "ÐлÑна"}],
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;
}));
/* key:value pairs that come to replacer:
: [object Object]
title: ÐонÑеÑенÑÑÑ
participants: [object Object],[object Object]
0: [object Object]
name: Ðван
1: [object Object]
name: ÐлÑна
place: [object Object]
number: 23
occupiedBy: [object Object]
*/
ÐÑÐ´Ñ Ð»Ð°Ñка, звеÑнÑÑÑ ÑвагÑ, Ñо ÑÑнкÑÑÑ replacer оÑÑимÑÑ ÐºÐ¾Ð¶Ð½Ñ Ð¿Ð°ÑÑ ÐºÐ»ÑÑ/знаÑеннÑ, вклÑÑаÑÑи Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ Ð¾Ð±âÑкÑи Ñа елеменÑи маÑивÑ. Рвона заÑÑоÑовÑÑÑÑÑÑ ÑекÑÑÑивно. ÐнаÑÐµÐ½Ð½Ñ this вÑеÑÐµÐ´Ð¸Ð½Ñ replacer â Ñе обâÑкÑ, Ñкий мÑÑÑиÑÑ Ð¿Ð¾ÑоÑÐ½Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ.
ÐеÑÑий виклик оÑобливий. ÐÑн зÑоблений з викоÑиÑÑаннÑм ÑпеÑÑалÑного âобâÑкÑа обгоÑÑкиâ: {"": meetup}. ÐнÑими Ñловами, пеÑÑа паÑа (key, value) Ð¼Ð°Ñ Ð¿Ð¾ÑожнÑй клÑÑ, а знаÑÐµÐ½Ð½Ñ Ñ ÑÑлÑовим обâÑкÑом загалом. ÐÑÑ ÑÐ¾Ð¼Ñ Ð¿ÐµÑÑий ÑÑдок в пÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð²Ð¸Ñе бÑде ":[object Object]" .
ÐÐ´ÐµÑ Ð¿Ð¾Ð»ÑÐ³Ð°Ñ Ð² ÑомÑ, Ñоб забезпеÑиÑи Ñкомога бÑлÑÑе можливоÑÑей Ð´Ð»Ñ ÑÑнкÑÑÑ replacer â вона Ð¼Ð°Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²ÑÑÑÑ Ð°Ð½Ð°Ð»ÑзÑваÑи Ñа замÑниÑи/пÑопÑÑÑиÑи навÑÑÑ Ð²ÐµÑÑ Ð¾Ð±âÑкÑ, ÑкÑо Ñе необÑ
Ñдно.
ФоÑмаÑÑваннÑ: space
ТÑеÑÑй аÑгÑÐ¼ÐµÐ½Ñ JSON.stringify(value, replacer, space) â Ñе кÑлÑкÑÑÑÑ Ð¿ÑобÑлÑв, Ñо викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð³Ð°Ñного ÑоÑмаÑÑваннÑ.
РанÑÑе вÑÑ ÑозÑÑгнÑÑÑ Ð¾Ð±âÑкÑи не мали вÑдÑÑÑÐ¿Ñ Ñа додаÑковиÑ
пÑобÑлÑв. Це добÑе, ÑкÑо ми Ñ
оÑемо надÑÑлаÑи обâÑÐºÑ ÑеÑез меÑежÑ. ÐÑгÑÐ¼ÐµÐ½Ñ space викоÑиÑÑовÑÑÑÑÑÑ Ð²Ð¸ÐºÐ»ÑÑно Ð´Ð»Ñ Ð²Ð¸Ð²Ð¾Ð´Ñ Ð² зÑÑÑÐ½Ð¾Ð¼Ñ Ð´Ð»Ñ ÑиÑÐ°Ð½Ð½Ñ Ð²Ð¸Ð³Ð»ÑдÑ.
ТÑÑ space = 2 ÑказÑÑ JavaScript показаÑи Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ Ð¾Ð±âÑкÑи на декÑлÑкоÑ
ÑÑдкаÑ
, з вÑдÑÑÑпом Ñ 2 пÑобÑли вÑеÑÐµÐ´Ð¸Ð½Ñ Ð¾Ð±âÑкÑа:
let user = {
name: "Ðван",
age: 25,
roles: {
isAdmin: false,
isEditor: true
}
};
alert(JSON.stringify(user, null, 2));
/* вÑдÑÑÑп в 2 пÑобÑли:
{
"name": "Ðван",
"age": 25,
"roles": {
"isAdmin": false,
"isEditor": true
}
}
*/
/* Ð´Ð»Ñ JSON.stringify(user, null, 4) ÑезÑлÑÑÐ°Ñ Ð¼ÑÑÑиÑÑ Ð±ÑлÑÑе пÑобÑлÑв:
{
"name": "Ðван",
"age": 25,
"roles": {
"isAdmin": false,
"isEditor": true
}
}
*/
ТÑеÑÑй аÑгÑÐ¼ÐµÐ½Ñ Ñакож може бÑÑи ÑÑдок. У ÑÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ ÑÑдок викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð²ÑдÑÑÑÐ¿Ñ Ð·Ð°Ð¼ÑÑÑÑ ÑÑда пÑобÑлÑв.
ÐаÑамеÑÑ space викоÑиÑÑовÑÑÑÑÑÑ Ð²Ð¸ÐºÐ»ÑÑно Ð´Ð»Ñ Ð»Ð¾Ð³ÑÐ²Ð°Ð½Ð½Ñ Ñа гаÑного виводÑ.
СпеÑÑалÑний âtoJSONâ
ÐодÑбно до меÑÐ¾Ð´Ñ toString Ð´Ð»Ñ Ð¿ÐµÑеÑвоÑÐµÐ½Ð½Ñ Ð² ÑÑдок, обâÑÐºÑ Ñакож може маÑи меÑод toJSON Ð´Ð»Ñ Ð¿ÐµÑеÑвоÑÐµÐ½Ð½Ñ Ð² JSON. ФÑнкÑÑÑ JSON.stringify авÑомаÑиÑно Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ Ñей меÑод, ÑкÑо вÑн Ñ.
ÐапÑиклад:
let room = {
number: 23
};
let meetup = {
title: "ÐонÑеÑенÑÑÑ",
date: new Date(Date.UTC(2017, 0, 1)),
room
};
alert( JSON.stringify(meetup) );
/*
{
"title":"ÐонÑеÑенÑÑÑ",
"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: "ÐонÑеÑенÑÑÑ",
room
};
alert( JSON.stringify(room) ); // 23
alert( JSON.stringify(meetup) );
/*
{
"title":"ÐонÑеÑенÑÑÑ",
"room": 23
}
*/
Як ми можемо побаÑиÑи, toJSON викоÑиÑÑовÑÑÑÑÑÑ Ñк пÑи пÑÑÐ¼Ð¾Ð¼Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ JSON.stringify(room), Ñак Ñ ÐºÐ¾Ð»Ð¸ room вкладений в ÑнÑÐ¾Ð¼Ñ ÑеÑÑалÑÐ·Ð¾Ð²Ð°Ð½Ð¾Ð¼Ñ Ð¾Ð±âÑкÑÑ.
JSON.parse
Щоб декодÑваÑи JSON-ÑÑдок, нам поÑÑÑбен ÑнÑий меÑод, Ñо називаÑÑÑÑÑ JSON.parse.
СинÑакÑиÑ:
let value = JSON.parse(str[, reviver]);
- str
- JSON-ÑÑдок Ð´Ð»Ñ Ð¿ÐµÑеÑвоÑÐµÐ½Ð½Ñ Ð² обâÑкÑ.
- reviver
- ÐеобовâÑзкова ÑÑнкÑÑÑ, Ñка бÑде викликана Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾
(key, value)Ñа може пеÑеÑвоÑÑваÑи знаÑеннÑ.
ÐапÑиклад:
// маÑив Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ñ ÑÑдка
let numbers = "[0, 1, 2, 3]";
numbers = JSON.parse(numbers);
alert( numbers[1] ); // 1
Ðбо Ð´Ð»Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¾Ð±âÑкÑÑв:
let userData = '{ "name": "Ðван", "age": 35, "isAdmin": false, "friends": [0,1,2,3] }';
let user = JSON.parse(userData);
alert( user.friends[1] ); // 1
JSON може бÑÑи наÑÑÑлÑки Ñкладним, наÑкÑлÑки Ñе Ð½ÐµÐ¾Ð±Ñ Ñдно, обâÑкÑи Ñа маÑиви можÑÑÑ Ð²ÐºÐ»ÑÑаÑи ÑнÑÑ Ð¾Ð±âÑкÑи Ñа маÑиви. Ðле вони Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð´Ð¾ÑÑимÑваÑиÑÑ Ñого ж ÑоÑмаÑÑ JSON.
ÐÑÑ ÑÐ¸Ð¿Ð¾Ð²Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ в ÑÑкопиÑÐ½Ð¾Ð¼Ñ JSON (ÑÐ½Ð¾Ð´Ñ Ð¼Ð¸ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð¿Ð¸ÑаÑи його Ð´Ð»Ñ Ð·Ð½Ð°Ñ Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº):
let json = `{
name: "Ðван", // помилка: Ñм'Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð±ÐµÐ· лапок
"surname": 'Smith', // помилка: одинаÑÐ½Ñ Ð»Ð°Ð¿ÐºÐ¸ Ð´Ð»Ñ Ð·Ð½Ð°ÑÐµÐ½Ñ (Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð±ÑÑи подвÑйними)
'isAdmin': false // помилка: одинаÑÐ½Ñ Ð»Ð°Ð¿ÐºÐ¸ Ð´Ð»Ñ ÐºÐ»ÑÑÑв (Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð±ÑÑи подвÑйними)
"birthday": new Date(2000, 2, 3), // помилка: не дозволÑÑÑÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ "new", ÑÑлÑки знаÑеннÑ
"friends": [0,1,2,3] // ÑÑÑ Ð²Ñе добÑе
}`;
ÐÑÑм Ñого, JSON не пÑдÑÑимÑÑ ÐºÐ¾Ð¼ÐµÐ½ÑаÑÑ. ÐÐ¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼ÐµÐ½ÑаÑÑ Ð´Ð¾ JSON ÑобиÑÑ Ð¹Ð¾Ð³Ð¾ недÑйÑним.
ÐÑнÑÑ ÑнÑий ÑоÑмаÑ, Ñкий називаÑÑÑÑÑ JSON5, Ñо пÑдÑÑимÑÑ ÐºÐ»ÑÑÑ Ð½Ðµ обеÑÐ½ÐµÐ½Ñ Ð² лапки, коменÑаÑÑ ÑоÑо. Ðле Ñе окÑема бÑблÑоÑека, а не ÑаÑÑина ÑпеÑиÑÑкаÑÑÑ Ð¼Ð¾Ð²Ð¸.
ÐвиÑайний JSON Ñ Ð½Ð°ÑÑÑлÑки ÑÑÑогим не ÑомÑ, Ñо його ÑозÑобники ледаÑÑ, а ÑомÑ, Ñо дозволÑÑ Ð»ÐµÐ³ÐºÐ¾, надÑйно Ñа дÑже Ñвидко ÑеалÑзÑваÑи алгоÑиÑм кодÑÐ²Ð°Ð½Ð½Ñ Ñа ÑиÑаннÑ.
ÐикоÑиÑÑÐ°Ð½Ð½Ñ reviver
УÑвÑÑÑ, Ñо ми оÑÑимали ÑеÑÑалÑзований обâÑÐºÑ meetup з ÑеÑвеÑа.
ÐÑÑ Ñакий:
// title: (meetup title), date: (meetup date)
let str = '{"title":"ÐонÑеÑенÑÑÑ","date":"2017-11-30T12:00:00.000Z"}';
â¦Ð ÑÐµÐ¿ÐµÑ Ð½Ð°Ð¼ поÑÑÑбно деÑеÑÑалÑзÑваÑи Ñей обâÑкÑ, ÑобÑо Ð·Ð½Ð¾Ð²Ñ Ð¿ÐµÑеÑвоÑиÑи його в обâÑÐºÑ JavaScript.
ÐÑобÑмо Ñе, викликавÑи JSON.parse:
let str = '{"title":"ÐонÑеÑенÑÑÑ","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":"ÐонÑеÑенÑÑÑ","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() ); // заÑаз пÑаÑÑÑ!
Ðо ÑеÑÑ, Ñе Ñакож пÑаÑÑÑ Ð´Ð»Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¾Ð±âÑкÑÑв:
let schedule = `{
"meetups": [
{"title":"ÐонÑеÑенÑÑÑ","date":"2017-11-30T12:00:00.000Z"},
{"title":"ÐÐµÐ½Ñ Ð½Ð°ÑодженнÑ","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() ); // пÑаÑÑÑ!
ÐÑдÑÑмки
- JSON â Ñе ÑоÑÐ¼Ð°Ñ Ð´Ð°Ð½Ð¸Ñ , Ñкий Ð¼Ð°Ñ Ð²Ð»Ð°Ñний незалежний ÑÑандаÑÑ Ñа бÑблÑоÑеки Ð´Ð»Ñ Ð±ÑлÑÑоÑÑÑ Ð¼Ð¾Ð² пÑогÑамÑваннÑ.
- JSON пÑдÑÑимÑÑ Ð¿ÑоÑÑÑ Ð¾Ð±âÑкÑи, маÑиви, ÑÑдки, ÑиÑÑи, бÑÐ»ÐµÐ²Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ñа
null. - JavaScript Ð½Ð°Ð´Ð°Ñ Ð¼ÐµÑоди JSON.stringify Ð´Ð»Ñ ÑеÑÑалÑзÑÐ²Ð°Ð½Ð½Ñ Ð² JSON Ñ JSON.parse, Ñоб зÑиÑаÑи Ð´Ð°Ð½Ð½Ñ Ð· JSON.
- Ðбидва меÑоди пÑдÑÑимÑÑÑÑ ÑÑнкÑÑÑ ÑÑанÑÑоÑмаÑÑÑ Ð´Ð»Ñ ÑнÑелекÑÑалÑного ÑиÑаннÑ/запиÑÑ.
- ЯкÑо обâÑÐºÑ Ð¼Ð°Ñ Ð¼ÐµÑод
toJSON, Ñо вÑн викликаÑÑÑÑÑ Ð¿Ñи виконаннÑJSON.stringify.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)