JSON methods, toJSON

...

JSON metodlari va toJSON

Tasavvur qiling, bizda murakkab obyekt bor va uni satrga aylantirishni xohlaymiz, masalan, uni tarmoq orqali uzatish yoki jurnalga yozish uchun.

Tabiiyki, bunday satr barcha muhim xususiyatlarni o'z ichiga olishi kerak.

Biz buni quyidagi tarzda amalga oshirishimiz mumkin:

let user = {
  name: "John",
  age: 30,
 
  toString() {
    return `{name: "${this.name}", age: ${this.age}}`;
  }
};
 
alert(user); // {name: "John", age: 30}

Lekin dasturlash jarayonida yangi xususiyatlar qo'shilishi, eski xususiyatlar o'zgartirilishi yoki olib tashlanishi mumkin. Har safar toString funksiyasini yangilab borish qiyinchilik tug'diradi. Xususiyatlar ustidan aylantirib o'tish usulini ham sinab ko'rishimiz mumkin, lekin agar obyekt murakkab va ichki obyektlarni o'z ichiga olsa, ularni ham qayta ishlashimiz kerak bo'ladi.

Yaxshiyamki, bunday vaziyatlar uchun yechim allaqachon tayyor.

JSON.stringify

JSON (JavaScript Obyekt Notatsiyasi) qiymat va obyektlarni ifodalash uchun umumiy formatdir. U RFC 4627 standartida ta'riflangan. Dastlab u JavaScript uchun yaratilgan, ammo boshqa tillar ham JSON bilan ishlash uchun kutubxonalarni ta'minlagan. Shunday qilib, mijoz JavaScriptdan foydalanganda, server esa Ruby/PHP/Java/Whatever tilida yozilgan bo'lsa, JSON orqali ma'lumotlar almashish oson.

JavaScript quyidagi metodlarni taqdim etadi:

  • JSON.stringify: obyektlarni JSON formatiga aylantirish uchun.
  • JSON.parse: JSONni obyektga aylantirish uchun.

Masalan, biz quyida talaba obyektini JSON formatiga aylantiryapmiz:

let student = {
  name: 'John',
  age: 30,
  isAdmin: false,
  courses: ['html', 'css', 'js'],
  spouse: null
};
 
let json = JSON.stringify(student);
 
alert(typeof json); // string turidagi qiymat!
 
alert(json);
/* JSON formatida obyekt:
{
  "name": "John",
  "age": 30,
  "isAdmin": false,
  "courses": ["html", "css", "js"],
  "spouse": null
}
*/

Metod JSON.stringify(student) obyektni olib, uni satrga aylantiradi.

Olingan JSON satri "serializatsiya qilingan" yoki "stringify qilingan" obyekt deb ataladi. Biz uni tarmoqqa yuborishga yoki oddiy ma'lumotlar bazasiga yozib qo'yishga tayyormiz.

JSON kodlangan obyekt bilan oddiy obyekt literalining bir necha muhim farqlari bor:

  1. Satrlar faqat qo'shtirnoqda bo'ladi. JSONda bitta tirnoq yoki backtick ishlatilmaydi. Shunday qilib, 'John' "John"ga aylanadi.
  2. Obyekt xususiyatlarining nomlari ham qo'shtirnoqda bo'lishi kerak. Shunday qilib, age:30 "age":30ga aylanadi.

JSON quyidagi ma'lumot turlarini qo'llab-quvvatlaydi:

  • Obyektlar { ... }
  • Massivlar [ ... ]
  • Primetivlar:
    • Satrlar,
    • Raqamlar,
    • Boolean qiymatlar true/false,
    • null.

JSON.stringify va cheklovlar

JSON standartida ba'zi JavaScriptga xos xususiyatlar e'tibordan chetda qoladi, masalan:

  • Funksiya xususiyatlari (metodlar).
  • Simvolik kalitlar va qiymatlar.
  • undefined saqlovchi xususiyatlar.
let user = {
  sayHi() { // e'tiborga olinmaydi
    alert("Hello");
  },
  [Symbol("id")]: 123, // e'tiborga olinmaydi
  something: undefined // e'tiborga olinmaydi
};
 
alert( JSON.stringify(user) ); // {} (bo'sh obyekt)

Bu odatda muammo emas. Lekin bunday holatlarda jarayonni sozlash usullari mavjud.

To'liq sintaksis

JSON.stringify metodining to'liq sintaksisi quyidagicha:

let json = JSON.stringify(value[, replacer, space])
  • value: kodlanadigan qiymat.
  • replacer: kodlanadigan xususiyatlar ro'yxati yoki xaritani almashtirish funksiyasi.
  • space: formatlash uchun ishlatiladigan joylar soni.

Aksariyat hollarda, JSON.stringify faqat birinchi argument bilan ishlatiladi. Ammo, agar jarayonni aniq sozlash kerak bo'lsa, masalan, doira havolalarni chiqarib tashlash kerak bo'lsa, ikkinchi argumentdan foydalanish mumkin.

Masalan, quyida replacer array yordamida ba'zi xususiyatlar kodlanadi:

let room = {
  number: 23
};
 
let meetup = {
  title: "Conference",
  participants: [{name: "John"}, {name: "Alice"}],
  place: room
};
 
room.occupiedBy = meetup; // room meetupni belgilaydi
 
alert( JSON.stringify(meetup, ['title', 'participants']) );
// {"title":"Conference","participants":[{},{}]}

Yuqorida name xususiyati ro'yxatga kiritilmaganligi sababli, participants bo'sh obyektlarni o'z ichiga oladi.

JSON.stringify

Funksiya sifatida replacer foydalanish

Ro'yxat o'rniga funksiya ishlatilishi mumkin. Bu funksiya har bir key, value juftligi uchun chaqiriladi va o'zgaritirilgan qiymatni qaytaradi.

let room = {
  number: 23
};
 
let meetup = {
  title: "Conference",
  participants: [{name: "John"}, {name: "Alice"}],
  place: room
};
 
room.occupiedBy = meetup;
 
alert( JSON.stringify(meetup, function replacer(key, value) {
  return (key == 'occupiedBy') ? undefined : value;
}));

Formatlash: space

Uchinchi argument space - obyektlarni formallashtirish uchun ishlatiladi:

let user = {
  name: "John",
  age: 25,
  roles: {
    isAdmin: false,
    isEditor: true
  }
};
 
alert(JSON.stringify(user, null, 2));

Maxsus toJSON metodi

toString funksiyasiga o'xshab, obyektlar toJSON metodini taqdim etishi mumkin. JSON.stringify avtomatik ravishda uni chaqiradi:

let room = {
  number: 23,
  toJSON() {
    return this.number;
  }
};
 
alert( JSON.stringify(room) ); // 23

JSON.parse

Ma'lumotni qayta o'qish uchun JSON.parse ishlatiladi:

let numbers = "[0, 1, 2, 3]";
 
numbers = JSON.parse(numbers);
 
alert( numbers[1] ); // 1

Agar kerak bo'lsa, reviver funksiyasi yordamida qiymatlarni tahrirlash mumkin:

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;
});

Xulosa

  • JSON obyektlar, massivlar, primitiv qiymatlar (satrlar, raqamlar, booleanlar) va nullni qo'llab-quvvatlaydi.
  • JavaScript JSON.stringify va JSON.parse metodlarini taqdim etadi.
  • toJSON metodi mavjud bo'lsa, u avtomatik ravishda chaqiriladi.

Ushbu sahifada

GitHubda tahrirlash