Kuidas taastada objektid JSON-ist nii, et metaandmed jääksid säilitada?
sobes.tech AI
Vastus AI-lt
JSON.parse() metodi ar reviver funkciju var izmantot, lai atjaunotu objektus no JSON, saglabājot metadatus. Reviver ir izvēles funkcija, kas tiek izsaukta katrai JSON analīzes laikā pārī rakturs-vērtība. Tā ļauj modificēt dekodētās vērtības pirms to atgriešanas.
Piemērs, kā izmantot reviver, lai saglabātu tipu:
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
Sarežģītākos gadījumos, kad metadati var ietvert informāciju par lietotāja klasēm vai citām tipu struktūrām, JSON jāiekļauj skaidri marķieri vai shēma, kas apraksta datu tipus.
Piemērs ar marķieriem:
{
"user": {
"_type": "User",
"name": "Alice",
"registrationDate": {
"_type": "Date",
"value": "2023-10-26T12:00:00.000Z"
}
},
"settings": {
"theme": "dark"
}
}
Un atbilstošs 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
Šis pieeja prasa iepriekšēju vienošanos par metadatu struktūru JSON (piemēram, _type izmantošanu) un atjaunošanas loģikas realizāciju reviver funkcijā katram tipam. Lai saglabātu sarežģītus objektus, piemēram, lietotāja klases ar metodēm, būs nepieciešama sarežģītāka pieeja, iespējams, metožu serializācija un deserializācija vai specializētu bibliotēku izmantošana. Tomēr, standarta tipu un vienkāršu datu struktūru saglabāšanai, reviver ir efektīvs.