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); // чын
console.log(restoredObject.regexp instanceof RegExp); // чын
Көчмө учурларда, метадата колдонуучунун класстары же башка түрлөр тууралуу маалыматтарды камтышы мүмкүн, анда 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); // чын
console.log(restoredObjectWithMetadata.user.registrationDate instanceof Date); // чын
Бул ыкма JSONда метадата структурасына алдын ала макулдашуу жана reviver ичинде ар бир түр үчүн калыбына келтирүү логикасын ишке ашырууну талап кылат. Кыйынчылык туудурган объекттер, мисалы, колдонуучу класстарынын инстанциялары жана методдору менен, көбүрөөк өнүккөн ыкмаларды талап кылышы мүмкүн, мисалы, методдорду сериализациялоо жана десериализациялоо же атайын китепканаларды колдонуу. Бирок, стандарттык түрлөр жана жөнөкөй маалымат структуралары үчүн reviver жетиштүү эффективдүү.