İçeriğe geç

Kısa Bilgi 12 – Deserializing Different Types with Newtonsoft.Json

Bazen json datasını doğrudan bir nesneye bağlamak istemeyebiliriz. Örneğin bir base class üzerinden türettiğimiz nesnelerimiz olabilir ve json datası içinde bu nesne bilgisini Type key’i ile tuttuğumuzu tasarlayabiliriz.

string jsonData = "{ Type: 'Computer', Name: 'Test Computer 1', Price: '850.00 $' }";

Görüldüğü üzere json datayı Computer isimli objeye çevirebileceğimizi artık biliyoruz. Bu arada Computer isimli nesnemizin Device isimli nesneden türediğini varsayabiliriz.

    [JsonConverter(typeof(DeviceConverter))]
    public class Device
    {
        public string Type { get; set; }
    }

Şimdi Device nesnemiz için yukarıdaki kod bloğunda belirttiğimiz JsonConverter’ı hazırlamalıyız. Böylelikle deserialize işlemi için json datası içindeki tipe karşılık gelen bir nesne döndürebileceğiz.

    public class DeviceConverter : JsonConverter
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            //Json datasını okuyoruz.
            JToken jObject = JToken.ReadFrom(reader);
            
            //Json datası içindeki tip için Type nesnesi oluşturuyoruz.
            Type type = Type.GetType(string.Format("{0}.{1}", typeof(Device).Namespace, jObject["Type"].ToString())); 
            
            //Instance işlemini gerçekleştiriyoruz.
            var result = Activator.CreateInstance(type);

            //Instance aldığımız nesneyi json datası ile dolduruyoruz.
            serializer.Populate(jObject.CreateReader(), result);

            return result;
        }
    }

Artık deserialize işlemini gerçekleştirebiliriz. Deserialize işlemi için bize dönecek olan nesne Computer olacaktır. Aşağıdaki örnekte sonucu görebiliriz.

Örnek uygulamayı indirmek için şuradaki adresi kullanabilirsiniz.
Herkese mutlu kodlamalar dilerim.

Tarih:C#Kısa Bilgi

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.