Ինչպես վերականգնել օբյեկտները JSON-ից այնպես, որ մետադատությունները պահպանվեն?
sobes.tech AI
Պատասխան AI-ից
JSON- ից օբյեկտները վերականգնելու համար մետադատների պահպանմամբ, դուք կարող եք օգտագործել JSON.parse() մեթոդը և 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-ը բավականին արդյունավետ է։