JSON NEDİR, NE DEĞİLDİR:
D Dilinde Nasıl Kullanılır?
Alıntı:
Tarih: 30 Mayıs 2012 (srm.1.5.30)
Amaç: JSON'nun enlemesine ve boylamasına incelemekten çok D mucizesine ortak olmaktır.
Kaynaklar: Tüm destekleyen diller ile bu makaleden fazlası şurada (http://json.org/json-tr.html) Türkçe olarak okunabilir.
JSON (JavaScript Object Notation), Türkçe'de "ceysın" olarak okunur ve çok basit bir işaret diline(Fransızca notation) sahiptir. Amaç, insanlığın kolaylıkla okuyabileceği (evet, her şey bizim için...:)) ve fazla yer kaplamayan (ama JavaScript ile uyumlu!) bir veri değişimi meydana getirmekti. Öncüsü ise bu işin tek üstadı olan Douglas Crockford (<www.crockford.com>)'dur. Öğrenince anlaşılması basit olsa da (aşağıdaki çizim gibi) başlangıçta anlamsız gelebilir.
Bu yüzden ne olmadığını tarif ederek devam edelim:
Anlam olarak, kesinlikle ne Java dili ile ne de diğer programlama dilleriyle ilgili bir şey değildi(r). Doğrudan JS (JavaScript) ile ilgili olduğu ve Java dilinin JS'ye isim olarak benzese de tarihsel açıdan (-bknz. Mozilla (<www.mozilla.org>)) alakalı olmadığını önemle belirtmeliyim. Ancak sonradan Java dahil bir çok dil ve script'de (örn. D ve AS gibi, tam liste için tıklayın (<www.json.com>)) ayrıştırıcıları (parser) yazılmıştır. Bu da çok kolay yaygınlaşmasını sağlamıştır. D'de ise, dilin içinde yatan büyük potansiyel sayesinde kullanımı inanılmaz derecede kolaylaştırılmıştır.
İsterseniz JSON üzerinde devam etmeden önce, bu makalenin de yazılmasına vesile olan kodlara daha doğrusu harikulade D ile nasıl kullandığımıza bakalım. Çünkü bu makaleyi okuyorsanız önce bunu görmek isteyebilirsiniz:
import std.json, std.stdio, std.traits;
JSONValue to(Hedef : JSONValue, T)(T değer)
{
: : :
}
string opCastJSONValue(T)()
{/*
JSONValue json;
JSONValue[string] yapınınÜyesi;
yapınınÜyesi[...] = to!JSONValue(...); //*/
: : :
}
struct işçinin
{
string adı;
ubyte yaşı;
// Katma (mixin) ifadeleri, derleme anında buraya gelecek...
mixin.opCastJSONValue!İşcinin;
}
void main()
{
JSONValue çalışmaBelgesi;
auto işçiler = [ işçinin("Salih", 33),
İşçinin("Dinçer", 23)
];
with(çalışmaBelgesi){
type = JSON_TYPE.OBJECT;
object["İşçi Listesi"] = to!JSONValue(işçiler);
//object["Mesai Cetveli"] = to!JSONValue(mesaiCetveli);
}
toJSON(&çalışmaBelgesi).writeln;
}
Alıntı:
>Bu kodun, Ali Çehreli tarafından yazılmış orijinal haline şuradan (http://codepad.org/sDG4CJ7K), Öğrenci ve Öğretmen yapılarının olduğu sadeleştirilmiş örneğe ise buradan (http://codepad.org/LEYQ2k2s) erişebilirsiniz. Tüm kodlar DMD 2.059 ve yukarısında derlenir...
Elbette, kısmen verilmiş bu kodun tüm marifeti std.json sınıfındandır. Buradan D Dili olanağı olarak ek bir kod yazmadan (parser geliştirmeden) JSON kullanabildiğimizi çıkarabiliriz. Hatta DMD ile derlerken -X parametresi verdiğimizde, yazdığımız programdaki nesnelerin bir özetinin satır numaraları ile birlikte .json uzantlı bir dosya olarak oluştuğunu göreceksiniz. Her ne kadar bu, konumuz dışı olsa da D Dili'nin %100 UTF ve JSON destekli olduğunu belirtmeden geçemeyeceğim.
Devam etmeden evvel Ali Çehreli'nin hazırladığı D.ershane (http://ddili.org/ders/d/index.html)'yi takip etmeniz iyi olabilir. Çünkü yukarıdaki kodu tamamen anlayabilmeniz için sırasıyla aşağıdaki dersleri görmeniz gerekebilir. Eğer öyleyse lütfen önce dersleri öğrendikten sonra makaleye devam edin.
Dersler:
- Modüller ve Kütüphaneler (http://ddili.org/ders/d/moduller.html)
- Çokuzlular (TypeTuple) (http://ddili.org/ders/d/cokuzlular.html)
- Tür Nitelikleri (http://ddili.org/ders/d/tur_nitelikleri.html)
- İşleç Yükleme (http://ddili.org/ders/d/islec_yukleme.html)
- Katmalar (http://ddili.org/ders/d/katmalar.html)
- Otomatik Değerler (http://ddili.org/ders/d/auto.html)
D severler hemen fark edecekler; gerek işleç yükleme olsun, gerekse çokuzlular ve UCFS ve 'with()' kolaylığı ile dilin bir çok olanağı kullanılmıştır. O yüzde konuyu dağıtmamak için her özelliğin anlamı üzerinde çok durmayacağım. Ayrıca şuradaki (http://json.org/value.gif) çizimde JSON'da kullanılan veri türlerine bakabilirsiniz. Her ne kadar D dilinin rezerve edilmiş anahtar sözcükleriyle karışmaması için "object, str, integer, floating vb." veri türleri kullanılmışsa da Ali Çehreli tarafından geliştirilen 'to!JSONValue()' işlevi sayesinde bunları bilmenize bile gerek bırakmamaktadır.
Evet, başlıyoruz ama önce yazma! Çünkü yazma olmadan okuma (ayrıştırma) yapamayız...:)
'(Not: Dosya yazma ve okuma makale sonunda kısaca değinilecektir.)'
Öncelikle bir JSON belgesini şu şekilde tanımlamamız gerekiyor:
JSONValue çalışmaBelgesi;
type = JSON_TYPE.OBJECT;
Bu bizim güzel parantezler ile ifade edilen {...} kök nesnemizi tanımlar. Buna her ekleyeceğiniz başka nesneler hash (bu konuya sonra değineceğiz) algoritmasına göre farklı sırada dizilebilir.
Sonra mutlaka bir yapıya struct işçinin {...} ihtiyacımız var. Çünkü biz program yazarken JSON ile yapılar o kadar çok uyumludurlar ki sanki hiç JSON'a kalıbına uymamız gerekmiyormuş gibi geliştirme süreçini hızlı bir şekilde tamamlayabiliriz. Tabi bunda Jeremie Pelletier'in geliştirdiği ayrıştırcı (parser) ve Ali Çehreli'nin eklediği yardımcı kodlar sayesinde yapıyoruz. Yoksa gerek yazarken, gerekse okurken işler gerçekten bu kadar kolay değil. Bu vesileyle tüm geliştiricilere teşekkür ediyorum...
Dikkat ederseniz henüz yazma işlemini gerçekleştirmedik. Çünkü bugünlük vaktimiz bu kadar...:)
'(DEVAMI GELECEK)'
Sevgiler, saygılar...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]