JSON nedir ve C# ile JSON kullanımı
Merhaba dostlar.
Aslında sizlere türkçe kaynaklarda yarım yamalak anlatılan Django makalelerini, birebir çeviri yaparak seslenecektim. Ancak şimdilik mevcut projelerimizden dolayı bunu başka bir bahara bırakarak, sizlere “JSON nedir ve C# ile JSON kullanımı” makalesi ile sesleniyorum.
Bu makalede neleri öğreneceksiniz?
- JSON Nedir?
- C# ile JSON Verileri Oluşturmak
- C# ile JSON Verilerini Okumak
Hadi başlayalım!
1. JSON Nedir?
Aslında JSON (Javascript Object Notation), JavaScript tarafından bize sunulmuş bir nimettir. Türkçesi ise “Javascript Nesne Gösterimi”dir. Wikipedia‘ya göre “insanlar tarafından okunabilen bir veri değişimi biçimidir” denilse de, insanlar dediği kısım bence yazılım geliştiriciler içindir.
JSON bir ağaç yapısıyla çalışır ve XML mantığına benzerdir (kısmende benzer değildir). Ağaç yapısından ve kendisinin sunduğu özellikten dolayı, XML’den daha kolay ve daha hızlı işleyebilmekteyiz. Bağımsızdır, kısadır ve anlaşılabilir bir yapıdadır. XML ile karşılaştıracak olursak, benzerliğini göreceksiniz (Şekil 1).
Yukarıda örnek göstermek amacıyla, “Mersin Üniversitesine” ait üç öğrencinin JSON ve XML türlerine göre bir örneği mevcuttur. Dikkatinizi çekerse JSON daha kısa ve daha anlamlıdır. Köşe parantezlerin [] birer dizi olduğunu, süslü parantezlerin {} ise {“anahtar”:”değer”} mantığı taşıdığını görebilirsiniz.
Peki JSON bize nerede işe yarayacak? Eğer sizin tarafınızdan oluşturulmamış ikinci bir kaynaktan veri alışverişinde bulunmak isterseniz, JSON hayat kurtarır nitelikte olacaktır. Örneğin Twitter API’si kullanarak bir geliştirmek isterseniz karşınıza JSON çıkacaktır. Hatta pek çok sistem JSON veri paylaşımında bulunmaya başlamıştır. Google’da Free Json API yazarsanız, istemediğiniz kadar JSON ile karşılaşabilirsiniz.
Eğer XML ile uğraştıysanız, JSON’ın Key ve Value mantığı gibi bir durumunun olduğunu göreceksiniz. Nedir bu Key’leri ve Value’ları, yukarıdaki örnekten yola çıkalım ve örnek JSON kodumuzu Şekil 2’de verelim.
“universite” bir anahtardır (Key), “Mersin” ise değeridir (yani Value).
“ogrenciler” bir anahtardır ve değeri aslında bir dizidir. Çünkü değer içerisinde birden çok veri vardır. İnceleyecek olursak bu diziyi, içerisinde üç adet “isim” diye anahtarlar vardır. Bu anahtarların da aldığı değerler (Kurtay, Serdar, Şafak) vardır.
{“nekadar”:”100 Lira”} örneği de bir JSON’dur. “nekadar” ifadesi anahtar iken “100 Lira” ise değeridir. Yani JSON’un temel kalıbı {“key”:”value”} şeklindedir.
Temel bilgileri öğrendiğimize göre, gelelim en baba soru veya sorulara..
Bu JSON’ı nasıl oluşturacağız? Bunları tek tek Şekil 2’deki gibi mi elimizle biz mi yazacağız?
El-cevap çok sevdiğim dostumun deyişi ile “amelelik yapmaya gerek yok, vardır bir yolu”..
2. C# ile JSON Verileri Oluşturmak
Öncelikle Visual Studio’da bir Console uygulaması açalım. Solution Explorer üzerinden References kısmına sağ tıklayarak, JSON için ilgili kütüphaneyi kuralım (Şekil 3 ve Şekil 4).
Şu ana kadar yaptıklarımızı toparlayacak olursak, JSON için temel bilgilerini öğrendik ve bunu kendi C# uygulamamız için temel kütüphanesi kurmayı gerçekleştirdik. Gelelim uygulama yazılımına. Her şeyden önce tabii ki kütüphanemizi kurduysak, JSON için gerekli using tanımını yapmak lazım. Kod bloğumuzun en üst kısmına gerekli tanımı yapıyoruz.
using Newtonsoft.Json;
Şekil 2’deki JSON kod örneğini bizim yazılımımıza entegre etmek için öncelikle sınıflar ve Generic sınıflarla çalışacağız. Eğer hakkında bilgi sahibi değilseniz, Google amca buyurunuz.
Eğer C# uygulaması için yukarıdaki JSON örneğinin anahtarlarından (yani Key) bir class oluşturmakta zorlanıyorsanız, şu sitede otomatik class oluşturabilirsiniz C# için, buyurunuz. (Şekil 5 ve Şekil 6)
Örnek JSON Kodu
{ "universite":"Mersin", "ogrenciler":[ {"isim":"Kurtay"}, {"isim":"Serdar"}, {"isim":"Şafak"} ]}
Kendi kodumuzu kopyalarken kodda yer alan Example olan kısmı, kendi projemizde UniversiteOgrencileri olacak şekilde değişip yapıştırıyorum (Şekil 7).
Kod
public class Ogrenciler { public string isim { get; set; } } public class UniversiteOgrencileri { public string universite { get; set; } public IList ogrenciler { get; set; } }
Bu arada Şekil 7’deki gibi using kısmını değiştirmeyi unutmayınız..
Sıra geldi ilgili Class’ı kullanarak yeni verileri JSON gibi oluşturmaya..
Generic class ile ilgili alanlara atamayı yaptıktan sonra aslında tek yapmamız gereken, JsonConvert.SerializeObject() metodu ile JSON oluşturmaktır. Gelsin kodlar..
UniversiteOgrencileri universiteOgrencileri = new UniversiteOgrencileri(); universiteOgrencileri.universite = "Koç"; List p = new List(); Ogrenciler ogrenci1 = new Ogrenciler{ isim = "Şafak" }; Ogrenciler ogrenci2 = new Ogrenciler{ isim = "Dilara" }; Ogrenciler ogrenci3 = new Ogrenciler{ isim = "Can" }; p.Add(ogrenci1); p.Add(ogrenci2); p.Add(ogrenci3); universiteOgrencileri.ogrenciler = p; string json = JsonConvert.SerializeObject(universiteOgrencileri); System.Console.WriteLine(json);
Çıktıyı görelim (Şekil 8).
Oluşturma işlemimiz başarılı! Format biçimini beğenmedi iseniz, Google amca sayesinde bunu biçimsel hale getirebilirsiniz, buyurunuz. (Şekil 9)
3. C# ile JSON Verilerini Okutmak
Bence en basiti burası. Eğer JSON’dan elde ettiğiniz bir veri varsa, bunu aktarmayı tek kod ile gerçekleştirebilirsiniz. Hele Class’ınızda JSON’a uygunsa, tek kodunuz sizi bekliyordur.
İşimizi zorlaştıralım ve bir örnek senaryo düşünelim. Diyelim ki www.xyzuniversitesi.com/ornek.json adresinden bir üniversiteye ait öğrencilerin bilgilerini okumaya yarayan bir uygulama yazacaksınız.
İlgili öğrenci bilgileri de Şekil 9’daki gibi olsun.
İhtiyacımız olan ilk şey JSON’dan gelecek veridir. Çünkü öğrenci verileri burada tutulmaktadır. Bize de veriler lazımdır. Algoritma şeklinde düşünürsek ilk ilgili siteye talep oluşturmamız, ardından talep sonucu elde ettiğimiz değeri bir değişkene aktarmamız gerekmektedir. Aşağıdaki kod ile ilgili siteye JSON verisini elde etmek için talep oluşturalım, ardından elde ettiği verileri jsonVerisi adlı değişkene aktaralım.
string url = "<a href="https://www.eniskurtayyilmaz.com/ornek.json" target="_blank" rel="noopener noreferrer">www.xyzuniversitesi.com/ornek.json</a>"; HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; string jsonVerisi = ""; using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { StreamReader reader = new StreamReader(response.GetResponseStream()); //jsonVerisi adlı değişkene elde ettiği veriyi atıyoruz. jsonVerisi = reader.ReadToEnd(); }
Bunu yazdıktan sonra aman ha, using System.IO; ve using System.Net; tanımlarını yapmayı unutmayalım!
Neyse.. İlgili JSON için Class ve Generic class oluşturmayı öğrenmiştik yukarıda bir yerlerde. Dikkat ederseniz aynı anahtar (Key) üzerinden çalışmaktayım, sadece değerler (Value) farklıdır. Bu yüzden ilgili Class’ı silmemize gerek kalmayacak şimdilik bu uygulamada. Eğer siz başka bir çalışma yapıyorsanız, siz kendiniz bayağı yukarıda bahsettiğim gibi otomatik oluşturabilecek sitelerden faydalanarak bu işlemi yapabilirsiniz.
İlgili JSON’daki verileri kendi uygulamamızdaki Class’a aktarıp, bundan sonra istediğimizi yaptırabiliriz. Dedim ya tek kod, buyurunuz.
UniversiteOgrencileri universiteOgrencileri = JsonConvert.DeserializeObject(jsonVerisi);
Yukarıda “universiteOgrencileri” adlı UniversiteOgrencileri türü olan Class’a, DeserializeObject() Metodu ile ederek elde ettiğimiz verilerin hepsini düzenli olarak işledik. Tabi burada önceden bu hiyerarşiye uygun oluşturduğumuz Class önemli olan.
E hadi bir sonraki makalede görüşmek dileğiyle.
Bu makalede yer alan tüm kodlar için : https://github.com/eniskurtayyilmaz/csJsonKullanimi
Enis Kurtay YILMAZ
Hocam bu mantık ile bir borsa takip sitesinden anlık verileri okuyabilmemiz ve bunlarla işlemler yapabilmemiz mümkün müdür?
Elbette 🙂
Çok güzel, sade ve net anlatım olmuş, elinize sağlık.
Merhaba , GitHub’tan dosyayı çektim ve çalıştırmaya çalıştım ancak “Unexpected character encountered while parsing value: <. Path '', line 2, position 1" hatası alıyorum. Sebebi nedir bi fikriniz var mı ?
Merhaba!
Şu linki kontrol edebilirsiniz.
Hatanın sebebi örnek json dosyasındaki hata veren Türkçe karakterler, sorunsuz bir json dosyasına bağlanınca çalışıyor örnek için teşekkürler..
Selamlar hocam, dediğiniz işlemin tersi lazım;
Mesela websitemde http://dene.com/dene.json dosyası var.
Ben bir data okuyorum sistemden ve http://dene.com/dene.json ‘ a yazmak istiyorum.
Yazma örneklerinin hepsi dosyaya yazmak için.
Yardımcı olur musunuz.
Teşekkürler.
E zaten
JsonConvert.SerializeObject()
kodunu bunun için yaptik 🙂Enis Bey merhaba;
Kendim oluşturduğum mevcut json dosyasına yeni data ekleyebiliyor muyuz? Amacım şu ilk json dosyasını oluşturduk verileri ekleyip, kaydedip kapattık diyelim. Tekrar açıp içindekilerin üzerine yazmadan yeni veri ekleyebiliyor muyuz? Kodlaması nasıl olur?
Hocam merhabalar. url de bana json dataları geliyor. Bu dataları kendi class’ıma alıp burdan da db ye kaydetmek isriyorum.Aynı yolu mu takip etmem gerekecek?
Selamlar aşağıdaki şekilde gelen bir json verisini deserialize ederken örneğin ogrenciler altındaki isim keyi kutay olanın soyisim keyinin value’sunu bir değişkene atayarak kullanmak istiyorum, nasıl bir yol izlemem gerekiyor? Çıkamadım içinden, bu konuda yardımcı olabilir misiniz?
{
“universite”:”Mersin”,
“ogrenciler”:[
{“isim”:”Kurtay”,”soyisim”:”örnek1″},
{“isim”:”Serdar”,”soyisim”:”örnek12″},
{“isim”:”Şafak”,”soyisim”:”örnek2″}
]}