Sobes.tech
Middle+

JSON'dan nesneleri nasıl geri yükleriz, böylece meta veriler korunur?

sobes.tech yapay zeka

AI'dan gelen yanıt

JSON'dan kaydedilen meta verilerle nesneleri geri yüklemek için JSON.parse() yöntemi reviver fonksiyonu ile birlikte kullanılabilir. Reviver, JSON analiz sürecinde her anahtar-değer çifti için çağrılan isteğe bağlı bir fonksiyondur. Kodlanmış değerleri, geri döndürülmeden önce değiştirmeye olanak tanır.

Türü korumak için reviver kullanımı örneği:

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

Daha karmaşık durumlar için, meta veriler özel sınıf veya diğer türler hakkında bilgi içerebilecek şekilde açık işaretçiler veya JSON şeması içermelidir.

Açık işaretçilerle örnek:

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

Ve karşılık gelen 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

Bu yaklaşım, JSON'daki meta verilerin yapısı hakkında önceden anlaşmayı ve her tür için geri yükleme mantığının reviver'da uygulanmasını gerektirir. Karmaşık nesneler, örneğin metodlara sahip özel sınıf örnekleri, daha gelişmiş bir yaklaşım gerektirebilir, bu da metodların ayrı ayrı serileştirilmesini ve deserialize edilmesini veya özel kütüphaneler kullanmayı içerebilir. Ancak, standart türler ve basit veri yapıları için reviver oldukça etkilidir.