როგორ აღვადგინოთ ობიექტები JSON-დან ისე, რომ მეტადატა შენახული იყოს?
sobes.tech AI
პასუხი AI-სგან
JSON.parse() მეთოდის გამოყენება შესაძლებელია მეტადატების შენახვისთვის JSON-დან ობიექტების აღდგენისას, reviver ფუნქციის გამოყენებით. Reviver — ეს არის არჩევითი ფუნქცია, რომელიც გამოიძახება JSON-ის სინდექსის ანალიზის პროცესში თითოეული გასაღებისა და მნიშვნელობისთვის. ის საშუალებას აძლევს დესერილიზებული მნიშვნელობების შეცვლას სანამ ისინი დაბრუნდებიან.
მაგალითი reviver-ის გამოყენებით ტიპის შენახვისთვის:
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
მეტადატების უფრო რთული შემთხვევებისთვის, სადაც შეიძლება იყოს მომხმარებლის კლასების ან სხვა ტიპების ინფორმაცია, საჭიროა JSON-ში ჩასმა შესაბამისი მარკერები ან სქემა, რომელიც აღწერს მონაცემთა ტიპებს.
მაგალითი მარკერებით:
{
"user": {
"_type": "User",
"name": "Alice",
"registrationDate": {
"_type": "Date",
"value": "2023-10-26T12:00:00.000Z"
}
},
"settings": {
"theme": "dark"
}
}
და შესაბამისი 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
ეს მიდგომა მოითხოვს წინასწარ შეთანხმებას JSON-ის სტრუქტურაზე (_type-ის გამოყენებით) და აღდგენის ლოგიკის განხორციელებას reviver-ში თითოეული ტიპისთვის. რთული ობიექტების შენახვა, როგორიცაა მომხმარებლის კლასების ინსთანსები მეთოდებით, მოითხოვს უფრო დახვეწილ მიდგომებს, როგორიცაა მეთოდების სერილიზაცია და დესერილიზაცია ან სპეციალიზებული ბიბლიოთეკების გამოყენება. თუმცა, სტანდარტული ტიპებისა და მარტივი მონაცემთა სტრუქტურის შენახვისთვის, reviver ეფექტურია.