Sobes.tech
Middle+

Чӣ тавр метавон объектҳоро аз 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 кофист.