.Net CORE 3 ile JSON İşlemleri

  

       .Net Core 3'ün çıkmasına az bir zaman kala Microsoft tarafından duyurulan yeni makalede JSON işlemleri için bir kütüphane oluşturulduğu belirtildi. Bu kütüphane ile birlikte JSON oluşturma, serialize/deserialize, dosya okuma/yazma ve DOM işlemlerini ekstra bir kütüphane kurmadan yapabileceğiz. JSON işlemlerinde kullanılan en yayın ve popüler dağıtımlardan biri olan Newtonsoft'a göre de daha performanslı çalıştığı makalede belirtilmiş.

       Şu an Nuget store'da prerelease aşamasında yer alan "System.Text.Json" paketini, .Net Core 3'ün final versiyonuna entegre olarak ekstra bir kurulum yapmadan kullanılabilir olması planlanmakta.

       Özelliklere hızlıca göz atmak isterseniz sisteminizde aşağıdakilerin kurulu olması gerekmekte;

.Net Core 3 ile JSON İşlemlerini Yapmak

       Visual Studio 2019 kullanarak, yeni bir Console uygulaması oluşturalım.

Oluşturacağımız projeye "CoreJsonProjesi" ismini verdim.

       Kurulacağı yeri de belirttikten sonra projeyi oluşturuyoruz.

       Projenin özelliklerine girdiğimizde, projede kullanılan .Net Core versiyonunun "Target Framework" altında ".Net Core 3.0" olduğundan emin olun.

       JSON işlemlerini yapacağımız kütüphaneyi yüklemek için, Nuget Package Manager'i açıp, "System.Text.Json" yazarak indirelim. Arama işlemini yaparken arama kutusunun yanında yer alan "Include prerelease" kutusunun işaretli olduğundan emin olalım. 

JSON Serialize Kullanımı

       Projemize aşağıdaki gibi Ogrenci isminde bir sınıf(class) ekleyelim.

    public class Ogrenci
    {
        public string Ad { get; set; }
        public string Soyad { get; set; }
        public int No { get; set; }
        public double Ortalama { get; set; }
    }

       Projemizde Program.cs içerisinde yer alan Main metodu içerisine aşağıdaki gibi örnek bir öğrenci ekleyelim.

var yeniOgrenci = new Ogrenci
            {
                Ad = "Yiğit",
                Soyad = "Nuhuz",
                No = 320,
                Ortalama = 50
            };

       Elimizdeki modeli, metin olarak çevirmek için öncelikle Program.cs içerisine indirdiğimiz kütüphaneyi ekliyoruz.

using System.Text.Json.Serialization;

       Ardından Main içerisine aşağıdaki kod bloğunu ekleyip modelimizin string olarak JSON karşılığını alıyoruz.

var json = JsonSerializer.ToString<Ogrenci>(yeniOgrenci);

       Ardından oluşan sonucu ekrana yazdırabiliriz.

Console.WriteLine(json);

       Programımızı çalıştırdığımızda aşağıdaki sonucu alacaksınız. 

{"Ad":"Yigit","Soyad":"Nuhuz","No":320,"Ortalama":50}

       Serialize işlemini yaparken kullanabileceğimiz bazı özellikler de yer almakta. Mesela ekrana bastığımız değeri daha okunaklı bir hale getirmek için aşağıdaki gibi bir özellik tanımlayalım ve dönüşüm işlemi yapılırken bu özelliği de kullanalım.

    var options = new JsonSerializerOptions
            {
                WriteIndented = true
            };

            var json = JsonSerializer.ToString<Ogrenci>(yeniOgrenci,options);

       Uygulamayı tekrar çalıştırdığımızda aşağıdaki gibi daha okunaklı bir JSON göreceğiz. 

       Tüm bu işlemlerin ardından Main metodumuz aşağıdaki gibi olacaktır.

       static void Main(string[] args)
        {
            var yeniOgrenci = new Ogrenci
            {
                Ad = "Yigit",
                Soyad = "Nuhuz",
                No = 320,
                Ortalama = 50
            };

            var options = new JsonSerializerOptions
            {
                WriteIndented = true
            };

            var json = JsonSerializer.ToString<Ogrenci>(yeniOgrenci,options);

            Console.WriteLine(json);
        }

 

JSON Deserialize Kullanımı

       JSON metinlerini kendi oluşturduğumuz modellere dönüştürebiliriz. Bunun için öncelikle bir öğrenci JSON'ı tanımlayalım.

var json = "{\"Ad\":\"Yigit\",\"Soyad\":\"Nuhuz\",\"No\":320,\"Ortalama\":50}";

       JsonSerializer'ın Parse özelliğini kullanarak elimizdeki JSON'ı modele dönüştürelim.

var yeniOgrenci = JsonSerializer.Parse<Ogrenci>(json);

       Modelimiz içerisinde yer alan öğrenci bilgilerini ekranda gösterelim.

            Console.WriteLine($"Öğrenci adı:{yeniOgrenci.Ad}");
            Console.WriteLine($"Öğrenci soyadı:{yeniOgrenci.Soyad}");
            Console.WriteLine($"Öğrenci numarası:{yeniOgrenci.No}");
            Console.WriteLine($"Öğrenci ortalaması:{yeniOgrenci.Ortalama}");

        static void Main(string[] args)
        {
            var json = "{\"Ad\":\"Yigit\",\"Soyad\":\"Nuhuz\",\"No\":320,\"Ortalama\":50}";

            var yeniOgrenci = JsonSerializer.Parse<Ogrenci>(json);

            Console.WriteLine($"Öğrenci adı:{yeniOgrenci.Ad}");
            Console.WriteLine($"Öğrenci soyadı:{yeniOgrenci.Soyad}");
            Console.WriteLine($"Öğrenci numarası:{yeniOgrenci.No}");
            Console.WriteLine($"Öğrenci ortalaması:{yeniOgrenci.Ortalama}");
        }

       Dönüştürülmenin yapılacağı modele çeşitli özellikler de tanımlayabiliriz.

       JSON dönüşümlerinde aksi belirtilmedikçe gelen verilerin isimleri ile modelimizdeki değişkenlerin isimleri aynı olması gerekmekte. Fakat bizim örnek modelimizde yer alan "No" değişkeninin içini JSON içerisinde gelen "Numara" alanından almak istersek, modelimize aşağıdaki eklemeyi yapmamız gerekmekte.

        [JsonPropertyName("Numara")]
        public int No { get; set; }

       Yukarıdaki eklemeyi Ogrenci sınıfımıza yaptıktan sonra Main metodumuzu da aşağıdaki gibi değiştirip çalıştırdığımızda yine aynı sonucu göreceğiz.

        static void Main(string[] args)
        {
            var json = "{\"Ad\":\"Yigit\",\"Soyad\":\"Nuhuz\",\"Numara\":320,\"Ortalama\":50}";
            var yeniOgrenci = JsonSerializer.Parse<Ogrenci>(json);

            Console.WriteLine($"Öğrenci adı:{yeniOgrenci.Ad}");
            Console.WriteLine($"Öğrenci soyadı:{yeniOgrenci.Soyad}");
            Console.WriteLine($"Öğrenci numarası:{yeniOgrenci.No}");
            Console.WriteLine($"Öğrenci ortalaması:{yeniOgrenci.Ortalama}");
        }

        Dönüştürme işlemlerinde bazı alanlarda gelen veriyi almak yerine kendimizin vereceği değeri kullanmasını isteyebiliriz. Bunun için yine kendi modelimizde Ortalama değerine aşağıdaki eklemeyi yapıp, JSON'dan gelen değeri almamasını sağlayalım. 

        [JsonIgnore]
        public double Ortalama { get; set; }

       Ardından Main metodumuzu aşağıdaki gibi değiştirelim.

       static void Main(string[] args)
        {
            var json = "{\"Ad\":\"Yigit\",\"Soyad\":\"Nuhuz\",\"Numara\":320,\"Ortalama\":50}";
            var yeniOgrenci = JsonSerializer.Parse<Ogrenci>(json);

            Console.WriteLine($"Öğrenci ortalaması:{yeniOgrenci.Ortalama}");

            yeniOgrenci.Ortalama = 100;

            Console.WriteLine($"Öğrenci ortalaması:{yeniOgrenci.Ortalama}");
        }

       Böylelikte, önce modelimizdeki ilk değeri ardından da bizim atadığımız değeri ekrana gösterdik.

       Gördüğünüz gibi ilk olarak Ortalama değeri JSON içerisinde "50" vermemize rağmen "0" olarak "int" tipinin varsayılan değerini aldı. Ardından bizim atadığımız "100" değerini verdi.

JSON Writer Kullanımı

       Kendi oluşturacağımız JSON'ı kayıt etmek için öncelikle projemize aşağıdaki eklemeleri yapıyoruz.

using System.IO;
using System.Text;

       Ardından Main metodumuzu aşağıdaki gibi düzenliyoruz.

  static void Main(string[] args)
        {
            using (var memoryStream = new MemoryStream())
            {
                using (var jsonWriter = new Utf8JsonWriter(memoryStream))
                {
                    jsonWriter.WriteStartObject();
                    jsonWriter.WriteString("Ad", "Yigit");
                    jsonWriter.WriteString("Soyad", "Nuhuz");
                    jsonWriter.WriteNumber("No", 320);
                    jsonWriter.WriteNumber("Ortalama", 50.5);
                    jsonWriter.WriteEndObject();
                }

                FileStream file = new FileStream("YeniOgrenci.txt", FileMode.Create, FileAccess.Write);
                memoryStream.WriteTo(file);
                file.Close();

                string json = Encoding.UTF8.GetString(memoryStream.ToArray());
                Console.WriteLine(json);
            }
        }

       Kısada kodu açıklamak gerekir uygulama akışında kullanacağımız bir MemoryStream oluşturuyoruz. Bu sayede bellekte veri geçici veri depolayabileceğimiz bir alan oluşturuyoruz. RAM'i kullandığı için diski kullanmaktan daha performanslıdır ve geçici veri depolama işlemlerinde tercih edilir. MemoryStream'i oluşturduktan sonra onun içerisinde kullanacağımız Utf8JsonWriter tanımlıyoruz. Bu özellik de "System.Text.Json" ile beraber gelmekte ve JSON verileri oluşturmamızı sağlar. Ardından JSON içerisinde tutacağımız verileri hafızada ayırdığımız yere yazıyoruz.

       FileStream ile oluşturduğumuz veriyi yazacağımız bir dosya tanımlıyoruz. "YeniOgrenci.txt" ile dosyamızın adını ve uzantısını tanımlıyoruz. Dosya adının başına herhangi bir dosya yolu vermediğimiz için varsayılan olarak projemizin içerisindeki "bin\Debug\netcoreapp3.0" içerisine oluşturacaktır. Farklı bir dosya yoluna kayıt etmek isterseniz dosya ismini başına kaydetmek istediğiniz dosya yolunu yazabilirsiniz.

       Dosyayı oluşturup kaydettikten sonra son olarak hafızadaki verimizi bir string'e dönüştürüp ekrana yazıyoruz.

       Projeyi çalıştırdığımızda aşağıdaki gibi hem json'ı console'da hem de txt içerisinde göreceksiniz.

 

       Sonuç olarak, yıllardır Nuget mağazasında en yaygın kullanılan kütüphanelerden biri olan Newtonsoft.Json'a karşı yapılan bu yenilik geliştiriciler tarafından ne kadar tercih edilecek göreceğiz fakat yapılan performans testlerindeki hız artışı ve 3. parti kütüphane bağımlılığını azaltması bir çok projede tercih edilmesini sağlayacaktır. 

       Projeye Github üzerinden erişebilirsiniz.

 

Comments (2) -

  • Güzel yazı, ufak eleştiri yapacağım. En büyük yenilik adında saklı bence yazının UTF8 konusuna biraz değinmesi gerekirdi. Neden sınıfın adında özellikle encoding belirtme ihtiyacı duyumuşlar? Bu utf8 ise diğerleri ne? Gibi soruların cevapları olmalıydı.
  • Açık söylemek gerekirse çok güzel ve açıklayıcı bir yazı olmuş. Anladığım kadarıyla performans anlamında çok büyük bir fark yaratıyor bu kütüphane. .net Core ile ilgili yazıları ilgiyle takip ediyorum. Devamlarını bekliyoruz.

Add comment