Sobes.tech
Middle+

Kaip atkurti objektus iš JSON, kad būtų išsaugoti metaduomenys?

sobes.tech AI

Atsakymas iš AI

Naudojant JSON.parse() metodą su reviver funkcija galima atkurti objektus iš JSON, išsaugant metaduomenis. Reviver yra pasirenkama funkcija, kuri iškviečiama kiekvienai JSON analizės metu porai raktas-reikšmė. Ji leidžia modifikuoti dekoduotas reikšmes prieš jas grąžinant.

Pavyzdys, kaip naudoti reviver, norint išsaugoti tipą:

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

Sudėtingesniais atvejais, kai metaduomenys gali apimti naudotojo klasių ar kitų tipų informaciją, JSON turi būti įtraukti aiškūs žymekliai arba schema, aprašanti duomenų tipus.

Pavyzdys su žymekliais:

{
  "user": {
    "_type": "User",
    "name": "Alice",
    "registrationDate": {
      "_type": "Date",
      "value": "2023-10-26T12:00:00.000Z"
    }
  },
  "settings": {
    "theme": "dark"
  }
}

Ir atitinkamas 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 metodas reikalauja išankstinio susitarimo dėl JSON metaduomenų struktūros (pvz., naudojant _type raktą) ir atstatymo logikos realizavimo reviver funkcijoje kiekvienam tipui. Sudėtingesnių objektų, kaip naudotojo klasių su metodais, išsaugojimas reikalauja sudėtingesnių metodų, galbūt, metodų serializacijos ir deserializacijos ar specializuotų bibliotekų naudojimo. Tačiau, standartinių tipų ir paprastų duomenų struktūrų išsaugojimui, reviver yra efektyvus.