Forum: D Programlama Dili RSS
JSON nedir, ne değildir?
D dilinde nasıl kullanılır...
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: JSON nedir, ne değildir?
JSON NEDİR, NE DEĞİLDİR:
D Dilinde Nasıl Kullanılır?
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 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'dur. Öğrenince anlaşılması basit olsa da (aşağıdaki çizim gibi) başlangıçta anlamsız gelebilir.

[Resim: http://json.org/object.gif]

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) 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) 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;
}
Bu kodun, Ali Çehreli tarafından yazılmış orijinal haline şuradan, Öğrenci ve Öğretmen yapılarının olduğu sadeleştirilmiş örneğe ise buradan 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'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:

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 ç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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Ronin #2
Üye Nis 2011 tarihinden beri · 39 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Beğen butonu yok mu?
:D
Adaletli olmak zor iş.
zafer #3
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Eline sağlık Salih güzel olmuş ama bunu bir makale formatında hazırlasan ve makaleler bölümünde yayınlasan ve hatta örneğin PDF (Adobe Acrobat) ve ODF (LibreOffice) formatında indirme imkanıda sunsan çok daha harika olurdu diye düşünüyorum.

Beni yanlış anlama lütfen ama bence forum bu tür detaylı inceleme yazıları için pek uygun bir yer değil. Yinede sen bilirsin, burayada yazsan ben severek okuyacağım tabi ki :)
https://github.com/zafer06 - depo
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben daha tam okuyamadım. Salih, ben de makale olarak bana vereceğini varsayıyorum. Makaleler bölümüne ekleyeceğim.

Ali
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Sonunda bunu okuyabildim.

Ben de diğer arkadaşlar gibi yazıyı çok beğendim. Tamamlansın, makaleler bölümüne koyalım. Kitabın ilgili bölümlerini vermen çok yararlı olmuş.

Yazım hatalarına dikkat etmiyorum. Nasıl olsa en son bir kere daha gözden geçirilir.

  • bu işin tek üstadı: Bu fazla iddialı geliyor. Aartık Douglas Crockford'dan başka üstatları da olduğunu tahmin ediyorum. (?)

  • bknz. Mozilla: Bu parentezin tam olarak ne ile ilgili olduğunu anlamadım. Ayrıca o bağlantı mozilla.org sitesine gönderiyor ama orada neye bakılacağım açık değil.

  • tam liste için tıklayın: Bağlantının json.org olması gerekiyor, json.com değil.

  • with()'e karşı karışık duygular besliyorum. :) Bazı durumlarda yararlı olduğu kesin ama "Öncelikle bir JSON belgesini" diye başlayan satırın altındaki iki satıra bakalım... Satırları öyle koddan ayırınca 'type' yazmak yanlış oluyor; çalışmaBelgesi.type yazmak çok daha iyi olur. Ama bu sefer de kodda öyle bir satır olmadığı için with()'i bilmeyenlerin kafası karışabilir. Bu belki de çok önemli bir konu değil; farkettiğim için yazdım.

  • güzel parantezler ile ifade edilen {...}: Burada JSON düzeninden bahsettiğin anlaşılmayabilir çünkü D kodlarında da küme parantezleri var. ("güzel" derken "süslü parantez" kastediyorsun, değil mi?)

  • Tür ismi olarak 'işçinin' yerine 'işçi' olmasını seviyorum. Hatta kodlama standartlarına göre ben İşçi yazıyorum.

Şimdilik benden de bu kadar, :)
Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 17:20:41 (UTC -08:00)