JSON dan obyektlarni qanday tiklash mumkin, shunda meta ma'lumotlar saqlanadi?
sobes.tech AI
AIdan javob
JSON'dan saqlangan metama'lumotlar bilan obyektlarni tiklash uchun JSON.parse() usulidan reviver funktsiyasi bilan birga foydalanish mumkin. Reviver - bu JSON tahlil qilish jarayonida har bir kalit-qiymat juftligi uchun chaqiriladigan ixtiyoriy funktsiya. U dekodlangan qiymatlarni qaytarilishidan oldin o'zgartirish imkonini beradi.
Turini saqlash uchun reviverdan foydalanish misoli:
const jsonString = '{"date": "2023-10-27T10:00:00.000Z", "regexp": "/test/i"}';
const restoredObject = JSON.parse(jsonString, (key, value) => {
if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/.test(value)) {
return new Date(value);
}
if (typeof value === 'string' && /^\/.+\/[gimyus]*$/.test(value)) {
try {
const match = value.match(/^\/(.+)\/([gimyus]*)$/);
if (match) {
return new RegExp(match[1], match[2]);
}
} catch (e) {
}
}
return value;
});
console.log(restoredObject.date instanceof Date); // true
console.log(restoredObject.regexp instanceof RegExp); // true
Ko'proq murakkab holatlar uchun, metama'lumotlar maxsus sinflar yoki boshqa turlar haqida ma'lumotlarni o'z ichiga olishi mumkin, shuning uchun JSONda aniq belgilovchilar yoki ma'lumot turlarini tavsiflovchi sxema bo'lishi kerak.
Aniq belgilovchilar bilan misol:
{
"user": {
"_type": "User",
"name": "Alice",
"registrationDate": {
"_type": "Date",
"value": "2023-10-26T12:00:00.000Z"
}
},
"settings": {
"theme": "dark"
}
}
Va mos reviver:
class User {
constructor(name, registrationDate) {
this.name = name;
this.registrationDate = registrationDate;
}
}
const jsonWithMetadata = '{"user": {"_type": "User", "name": "Alice", "registrationDate": {"_type": "Date", "value": "2023-10-26T12:00:00.000Z"}}, "settings": {"theme": "dark"}}';
const restoredObjectWithMetadata = JSON.parse(jsonWithMetadata, (key, value) => {
if (value && typeof value === 'object' && value._type) {
switch (value._type) {
case 'Date':
return new Date(value.value);
case 'User':
return new User(value.name, new Date(value.registrationDate.value));
default:
return value;
}
}
return value;
});
console.log(restoredObjectWithMetadata.user instanceof User); // true
console.log(restoredObjectWithMetadata.user.registrationDate instanceof Date); // true
Ushbu usul JSON'dagi metama'lumotlar tuzilishi haqida oldindan kelishilgan va har bir tur uchun qayta tiklash logikasini reviverda amalga oshirishni talab qiladi. Murakkab obyektlar, masalan, metodlarga ega maxsus sinf misollari, yanada rivojlangan yondashuvni talab qilishi mumkin, bu esa metodlarni alohida serializatsiya va deserializatsiya qilish yoki maxsus kutubxonalarni ishlatishni o'z ichiga olishi mumkin. Biroq, standart turlar va oddiy ma'lumotlar tuzilmalari uchun reviver juda samarali.