Πώς να αποκαταστήσετε αντικείμενα από 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 για κάθε τύπο. Για την αποθήκευση πολύπλοκων αντικειμένων, όπως παραδείγματα προσαρμοσμένων κλάσεων με μεθόδους, απαιτείται πιο εξεζητημένη προσέγγιση, πιθανώς με ξεχωριστή σειριοποίηση και αποσειριοποίηση μεθόδων ή με τη χρήση εξειδικευμένων βιβλιοθηκών. Ωστόσο, για την αποθήκευση τυπικών τύπων και απλών δομών δεδομένων, ο reviver είναι αρκετά αποτελεσματικός.