Bu derste Vala ile nasıl Json işleyebileceğimize bakacağız
Bu derste Vala ile nasıl Json işleyebileceğimize bakacağız.
Oluşturacağımız ufak yazılım basit bir Json kütüğünü okuyacak.
int main()
{
string veri = """
{
"adres" : "http://www.elektronik.vercel.app",
"boy" : [ 652, 242 ]
}""";
var cevirici = new Json.Parser();
cevirici.load_from_data (veri);
var dugum = cevirici.get_root();
var okuyucu = new Json.Reader (dugum);
string adres = null;
int64 genislik = -1;
int64 yukseklik = -1;
foreach (string eleman in okuyucu.list_members())
switch (eleman)
{
case "adres":
bool okuyabildik = okuyucu.read_member("adres");
assert (okuyabildik == true);
assert (okuyucu.is_value());
adres = okuyucu.get_string_value();
okuyucu.end_member();
stdout.printf("%s\n", adres);
break;
case "boy":
bool okuyabildik = okuyucu.read_member("boy");
assert (okuyabildik == true);
assert (okuyucu.is_array());
assert (okuyucu.count_elements() == 2);
// İlk eleman
okuyucu.read_element(0);
assert (okuyucu.is_value());
genislik = okuyucu.get_int_value();
okuyucu.end_element();
// İkinci eleman
okuyucu.read_element(1);
assert (okuyucu.is_value());
yukseklik = okuyucu.get_int_value();
okuyucu.end_element();
stdout.printf("%" + int64.FORMAT +"\n", genislik);
stdout.printf("%" + int64.FORMAT +"\n", yukseklik);
break;
}
return 0;
}
Yazılımı isle5.vala ismi ile kaydediniz.
Uygulamayı derlemek için uç birimden aşağıdaki komutu veriniz.
valac --pkg json-glib-1.0 isle5.vala
Uygulamayı ./isle5 yazarak çalıştırabilirsiniz.
cevirici isimli değişen ile verileri Json biçeminden kullanabileceğimiz biçime çeviriyoruz.
dugum değişkeni ile bir düğüm elde ediyoruz. Daha sonra bu düğümü okuyucu'ya aktarıyoruz.
Burada genislik ve yukseklik tamsayı değişkenleri için int64 türü kullanılmış.
Bu aşamada eğer okuyucu.list_members() işlevini printf ile yazdırmak isteyebilirsiniz. Eğer yazdırırsanız adres ve boy yazacak.
adres değişkeninin dizge türünde tek bir değişken olduğunu görebilirsiniz. bool okuyabildik değişkeni ile okuyup okuyamadığımızı sınıyoruz.
assert (okuyabildik == true);
satırı ile de evet gerçekten okuyabildik diye sınıyoruz.
assert (okuyucu.is_value());
satırı ile okuduğumuz değer tek bir değişken mi diye sınıyoruz. Yani bir dizi değil.
Daha sonra adres değişkenine bu değeri atıyor ve yazdırıyoruz.
boy değişkeni ise bir Json dizisidir.
assert (okuyucu.is_array());
Bu satırda okuduğumuz bir dizi mi diye sınama yapıyoruz.
assert (okuyucu.count_elements() == 2);
Bu satır dizinin iki elemanı mı var diye sınıyor.
okuyucu.read_element(0);
Dizinin birinci elemanını bu şekilde okuyoruz.
stdout.printf("%" + int64.FORMAT +"\n", yukseklik);
int64 biçimindeki tam sayıları ise yukarıda görüldüğü gibi yazdırıyoruz.
Öncelikle aşağıdaki bilgileri ulkelerbasit.txt ismi ile kaydediniz.
[{"isim":"Kuzey Kıbrıs Türk Cumhuriyeti","ingilizce":"Turkish Republic Of Northern Cyprus","_id":1},{"isim":"Türkiye","ingilizce":"Turkiye","_id":2},{"isim":"Azerbaycan","ingilizce":"Azerbaijan","_id":3}]
Aşağıdaki örnek yazılımı ise isle3.vala ismi ile kaydediniz.
int main()
{
var cevirici = new Json.Parser();
cevirici.load_from_file("ulkelerbasit.txt");
var dizici = new Json.Generator();
dizici.set_root (cevirici.get_root());
dizici.set_pretty (true);
size_t uzunluk;
string okunan = dizici.to_data (out uzunluk);
stdout.printf("Uzunluk %" + size_t.FORMAT +"\n" , uzunluk);
stdout.printf("Okunan %s\n", okunan);
return 0;
}
Uygulamayı derlemek için aşağıdaki komutu veriniz.
valac --pkg json-glib-1.0 isle3.vala
Uygulamayı ./isle3 yazarak çalıştırabilirsiniz.
Uygulamayı çalıştırdığınızda çıktısı aşağıdaki gibidir.
Uzunluk 290
Okunan [
{
"isim" : "Kuzey Kıbrıs Türk Cumhuriyeti",
"ingilizce" : "Turkish Republic Of Northern Cyprus",
"_id" : 1
},
{
"isim" : "Türkiye",
"ingilizce" : "Turkiye",
"_id" : 2
},
{
"isim" : "Azerbaycan",
"ingilizce" : "Azerbaijan",
"_id" : 3
}
]
Bu uygulama Json kütüğünü okuyup ekrana yazıyor.
Gene aynı giriş kütüğünü kullanalım. Aşağıdaki kütüğü ulkelerbasit.txt ismi ile kaydediniz.
[{"isim":"Kuzey Kıbrıs Türk Cumhuriyeti","ingilizce":"Turkish Republic Of Northern Cyprus","_id":1},{"isim":"Türkiye","ingilizce":"Turkiye","_id":2},{"isim":"Azerbaycan","ingilizce":"Azerbaijan","_id":3}]
Aşağıdaki yazılımı isle7.vala ismi ile kaydediniz.
void kutugeYaz (string[] veriler, string kutukIsmi)
{
var kutuk = FileStream.open(kutukIsmi, "w+");
assert (kutuk != null);
foreach (string veri in veriler)
{
kutuk.puts(veri);
kutuk.putc('\n');
}
kutuk.flush();
}
int main()
{
var cevirici = new Json.Parser();
cevirici.load_from_file("ulkelerbasit.txt");
var dugum = cevirici.get_root();
var okuyucu = new Json.Reader (dugum);
string isim = null;
string ingilizce = null;
int64 no = -1;
string[] ulkeIsimleri = null;
string[] ingilizceUlkeIsimleri = null;
int64[] numaralar = null;
var kacTane = okuyucu.count_elements();
stdout.printf("Kaç eleman = %d\n", kacTane);
for (int i = 0; i < kacTane; ++i)
{
okuyucu.read_element(i);
foreach (string eleman in okuyucu.list_members())
switch (eleman)
{
case "isim":
bool okuyabildik = okuyucu.read_member("isim");
isim = okuyucu.get_string_value();
okuyucu.end_member();
stdout.printf("%s\n", isim);
ulkeIsimleri += isim;
break;
case "ingilizce":
bool okuyabildik = okuyucu.read_member("ingilizce");
ingilizce = okuyucu.get_string_value();
okuyucu.end_member();
stdout.printf("%s\n", ingilizce);
ingilizceUlkeIsimleri += ingilizce;
break;
case "_id":
bool okuyabildik = okuyucu.read_member("_id");
no = okuyucu.get_int_value();
okuyucu.end_member();
stdout.printf("%" + int64.FORMAT +"\n", no);
numaralar += no;
break;
}
okuyucu.end_element ();
}
kutugeYaz(ulkeIsimleri, "ülkeisim.txt");
kutugeYaz(ingilizceUlkeIsimleri, "ingilizceisimler.txt");
return 0;
}
Bu uygulamanın diğerinden farkı bu sefer verileri sadece ekrana yazmak değil kullanmak istiyoruz.
Örneğin ülke isimlerini ve numaralarını ayrı değişkenlere kaydettik.
Ayrıca bir diziden okuma yaptığımız için ilk önce dizinin eleman sayısını aşağıdaki gibi alıyoruz.
var kacTane = okuyucu.count_elements();
Daha sonra for döngüsünün içinde
okuyucu.read_element(i);
ile elemanlar arasında geziniyoruz.
Uygulamayı aşağıdaki komutla derleyebilirsiniz.
valac --pkg json-glib-1.0 --pkg glib-2.0 isle7.vala
Uygulamayı ./isle7 şeklinde çalıştırdığımızda çıktısı aşağıdaki gibidir.
Kaç eleman = 3
Kuzey Kıbrıs Türk Cumhuriyeti
Turkish Republic Of Northern Cyprus
1
Türkiye
Turkiye
2
Azerbaycan
Azerbaijan
3
Türkçe ve İngilizce ülke isimlerini farklı kütüklere yazmak için kutugeYaz isimli işlevi kullanıyoruz.
ülkeisim.txt kütüğüne bakalım.
Kuzey Kıbrıs Türk Cumhuriyeti
Türkiye
Azerbaycan
Daha önceki bölümde oluşturduğumuz ülkeisim.txt kütüğü şu şekilde idi.
Kuzey Kıbrıs Türk Cumhuriyeti
Türkiye
Azerbaycan
Ülkelerinin yabancı dilde isimlerinin yer aldığı ingilizceisimler.txt kütüğü ise aşağıdaki gibi idi.
Turkish Republic Of Northern Cyprus
Turkiye
Azerbaijan
Şimdi bu verilerden nasıl Json oluşturabileceğimize bakalım.
Aşağıdaki kütüğü isle9.vala ismi ile kaydediniz.
string[] kutukOku(string kutukIsmi)
{
string[] kelimeler = {};
var kutuk = File.new_for_path(kutukIsmi);
var okunan = new DataInputStream (kutuk.read());
string satir = "";
while ((satir = okunan.read_line(null)) != null)
{
kelimeler += satir.strip();
}
return kelimeler;
}
int main()
{
string[] ulkeIsimleri = kutukOku("ülkeisim.txt");
string[] ingilizceUlkeIsimleri = kutukOku("ingilizceisimler.txt");
var yapici = new Json.Builder();
yapici.begin_array();
for (int i=0; i < 3; ++i)
{
yapici.begin_object();
yapici.set_member_name("_id");
yapici.add_int_value(i + 1);
yapici.set_member_name("isim");
yapici.add_string_value(ulkeIsimleri[i]);
yapici.set_member_name("ingilizce");
yapici.add_string_value(ingilizceUlkeIsimleri[i]);
yapici.end_object();
}
yapici.end_array();
var dizici = new Json.Generator();
var dugum = yapici.get_root();
dizici.set_root(dugum);
string sonuc = dizici.to_data(null);
stdout.printf("%s", sonuc);
return 0;
}
Uygulamayı derlemek için aşağıdaki komutu veriniz.
valac --pkg json-glib-1.0 isle9.vala
Uygulamayı ./isle9 yazarak çalıştıralım.
Görülebileceği üzere kullanıcı verilerinden de Json oluşturabiliyoruz.
[{"_id":1,"isim":"Kuzey Kıbrıs Türk Cumhuriyeti","ingilizce":"Turkish Republic Of Northern Cyprus"},{"_id":2,"isim":"Türkiye","ingilizce":"Turkiye"},{"_id":3,"isim":"Azerbaycan","ingilizce":"Azerbaijan"}]
Yorumlar