Thread overview
asdf json kullanarak dosyaya yazma
Dec 15, 2016
erdem
Dec 15, 2016
erdem
Dec 15, 2016
erdem
Dec 16, 2016
erdem
December 15, 2016

asdf kütüphanesi (https://github.com/tamediadigital/asdf) kullanarak verileri json dosyaya yazdırmaya çalışıyorum.

import asdf;

struct SayfaListesi
{
   string isim;
   string bağlantı;
   string resim;
   string açıklama;
}

void main()
{
   auto liste = SayfaListesi(konuBaşlığı, adres.kütük, resimYolu, ilkCümle);
   auto kütük = File("arduino.json", "a");
   kütük.writeln(liste.serializeToJson);
}

Dosyaya yazıyor ama acaba yazım şekli bu şekilde mi.

'{"isim":"Arduino başlangıç","bağlantı":"arduinobaslangic.html","resim":"/wiki/_media/arduino/arduino_parcalari.jpg","açıklama":"Arduino açık kaynak donanıma sahip ATMEL firmasının ürettiği ATmega serisi mikrodenetleyici tabanlı bir elektronik geliştirme havuzudur."}
{"isim":"Arduino başlangıç","bağlantı":"arduinobaslangic.html","resim":"/wiki/_media/arduino/arduino_parcalari.jpg","açıklama":"Arduino açık kaynak donanıma sahip ATMEL firmasının ürettiği ATmega serisi mikrodenetleyici tabanlı bir elektronik geliştirme havuzudur."}'

Ben dosyaya yazarken {"isim": ..., "bağlantı": ...,"resim": ..., "açıklama": ...,
"isim": ..., "bağlantı": ...,"resim": ..., "açıklama": ...}

şeklinde yazar diye düşünüyordum. Bu kayıtlar her seferinde değişecek ve eğer bir kayıt varsa tekrar kütüğe yazılmayacak.

Kütük okumayla ilgili örnekler var ama yazmayla ilgili örnek koymamışlar sanırım.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 15, 2016

Hımm.. şimdi biraz anlamaya başlıyorum sanırım.

import std.stdio;
import asdf;

struct Kitap
{
   string isim;
   string yazar;
   string tür;
   Detay detay;
}

struct Detay
{
   string yayınevi;
   int basımYılı;
   string dil;
   int sayfaSayısı;
}

void main()
{
   auto detay = Detay("alfa", 2004, "türkçe", 254);
   auto kitap = Kitap("D programlama dili", "Ali Çehreli", "programlama", detay);
   auto kütük = File("kitap.json", "w");
   kütük.writeln(kitap.serializeToJsonPretty);
}

Json'daki her nesne { } arası D'de kullandığımız yapılara tekabül ediyor anladığım kadarıyla. Programın çıktısı:

'{
"isim": "D programlama dili",
"yazar": "Ali Çehreli",
"tür": "programlama",
"detay": {
"yayınevi": "alfa",
"basımYılı": 2004,
"dil": "türkçe",
"sayfaSayısı": 254
}
}'

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 15, 2016

Teşekkürler! :)

http://www.w3resource.com/JSON/introduction.php

Ben de şuradaki örneğin dizi gerçeklemesini hangi tür yapıyor diyordum. Dizi içindeki yapılar yapıyormuş.

import std.stdio;
import asdf;

struct Kitap
{
   string isim;
   string yazar;
   string tür;
   Detay detay;
   int[string] fiyat;
   YeniFiyat [] yeniFiyat;
}

struct YeniFiyat
{
   string tür;
   int fiyat;
}

struct Detay
{
   string yayınevi;
   int basımYılı;
   string dil;
   int sayfaSayısı;
}

void main()
{
   auto detay = Detay("alfa", 2004, "türkçe", 254);
   auto kitap = Kitap("D programlama dili", "Ali Çehreli", "programlama",
                      detay, ["kartonkapak":100,"ekitap":50]);
   auto kartonkapak = YeniFiyat("kartonkapak", 150);
   auto ekitap = YeniFiyat("ekitap", 75);
   kitap.yeniFiyat ~= kartonkapak;
   kitap.yeniFiyat ~= ekitap;
   auto kütük = File("kitap.json", "w");
   kütük.writeln(kitap.serializeToJsonPretty);
}

Çıktısı:

'{
"isim": "D programlama dili",
"yazar": "Ali Çehreli",
"tür": "programlama",
"detay": {
"yayınevi": "alfa",
"basımYılı": 2004,
"dil": "türkçe",
"sayfaSayısı": 254
},
"fiyat": {
"kartonkapak": 100,
"ekitap": 50
},
"yeniFiyat": [
{
"tür": "kartonkapak",
"fiyat": 150
},
{
"tür": "ekitap",
"fiyat": 75
}
]
}
'

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 15, 2016

İstediğin davranışı ne File ne de serializeToJson bilebilir. serializeToJson'ın bildiği, JSON düzeninde string oluşturmak. O string'in hangi hedefe gittiğini ve yazılanın o hedefteki küme parantezinin içine yazılmasının istendiğinden emin olamaz. Benzer biçimde, File'a append etmesini söyleyince o da dosyanın JSON olduğuna karar verip senin ne istediğini düşünemez.

Çoğu durumda dosyayı baştan yazmak yeterlidir. Dosya çok büyükse başka "bu kaydın son hali şu dosyada" gibi bir sistemi sen kurmalısın. Tabii veri tabanları bu işi otomatik olarak halleder.

Yazdığın kaydın dosyada tam istediğin yerde değişmesini sağlayan düzenek memory-mapped file'dır. Ama sanırım o da kayıt uzunluklarının baştan bilindiği durumda yararlı olur. Bir diziyi bir dosyaya bağlıyorsun ve sen dizi elemanını değiştirdikçe dosyanın ilgili yeri değişiyor. Phobos'ta bunun desteği var ama örneği yok. :-/ JSON için dosyayı baştan yazmaktan farkı yoktur ama bilmekte yarar var:

https://dlang.org/phobos/std_mmfile.html

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 15, 2016

Doğru. JSON bir kaç kavramdan oluşan çok basit bir gösterimdir. Bütün dillerdeki nesne kavramını destekleyen türler JSON'da object kabul edilirler ve küme parantezleri arasına yazılırlar:

http://json.org/

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 16, 2016

Programın son hali şu şekilde olmuş oldu.

import std.stdio;
import std.file;
import std.algorithm;
import arsd.dom;
import adres;
import asdf;
import teksayfaolustur: Kiraz;
import dizge: ilkHarfBüyük;

struct Bölüm
{
   string bölümİsmi;
   string bölümAçıklaması;
   Sayfa[] sayfalar;
}

struct Sayfa
{
   string isim;
   string bağlantı;
   string resim;
   string açıklama;
}

Document kayıtGüncelle(Document belge, Adres adres, Kiraz kiraz)
{
   import std.string;

   auto sayfaBaşlığı = kiraz.bilgiler["sayfaBaşlığı"];
   auto resimYolu = kiraz.bilgiler["resimYolu"];
   auto ilkCümle = kiraz.bilgiler["ilkCümle"];
   auto kütükİsmi = kiraz.bilgiler["kütükİsmi"];
   auto bölümİsmi = kiraz.bilgiler["bölümİsmi"];

   if (!resimYolu)
   {
       writeln("Resim boş");
       resimYolu = "/resim/700x400.png";
   }

   auto geçerliSayfa = Sayfa(sayfaBaşlığı, kütükİsmi, resimYolu, ilkCümle);
   auto bölüm = Bölüm(ilkHarfBüyük(bölümİsmi));
   auto veriKütüğüİsmi = bölümİsmi ~ ".json";

   // kütük var mı
   if (exists (veriKütüğüİsmi))
   {
       auto kütük = File(veriKütüğüİsmi, "r");

       // kütüğü oku
       string veri;

       while (!kütük.eof())
       {
           veri ~= strip(kütük.readln());
       }

       bölüm = veri.deserialize!Bölüm;

       // sayfa var mı
       bool sayfaVarMı = false;

       foreach (sayfa; bölüm.sayfalar)
       {
           if (sayfa == geçerliSayfa)
               sayfaVarMı = true;
       }

       if (!sayfaVarMı)
       {
           writeln("Sayfayı ilk kez ekliyorum");
           bölüm.sayfalar ~= geçerliSayfa;
           kütük.close();
           kütük = File(veriKütüğüİsmi, "w");
           kütük.writeln(bölüm.serializeToJsonPretty);
       }
   }

   else
   {
       writeln("Lütfen " ~ bölümİsmi ~ " bölümü için açıklama giriniz : " );
       bölüm.bölümAçıklaması = strip(readln());
       auto kütük = File(veriKütüğüİsmi, "w");
       bölüm.sayfalar ~= geçerliSayfa;
       kütük.writeln(bölüm.serializeToJsonPretty);
       kütük.close;
   }
   return belge;
}

Programın çıktısı da biraz uzun olacak ama göstermek için ekliyorum.

'{
"bölümİsmi": "Arduino",
"bölümAçıklaması": "Arduino ile elektronik",
"sayfalar": [
{
"isim": "Arduino başlangıç",
"bağlantı": "arduino-başlangıç.html",
"resim": "/wiki/_media/arduino/arduino_parcalari.jpg",
"açıklama": "Arduino açık kaynak donanıma sahip ATMEL firmasının ürettiği ATmega serisi mikrodenetleyici tabanlı bir elektronik geliştirme havuzudur."
},
{
"isim": "Arduino ile Emacs kullanımı",
"bağlantı": "arduino-ile-emacs-kullanımı.html",
"resim": "/wiki/_media/arduino/arduino_ucbirim_program_yukleme.png",
"açıklama": "Arduino geliştirme ortamı ile her ne kadar yeni başlayan arkadaşların tüm ihtiyaçlarını karşılayacak düzeyde olsa da Emacs, Vi gibi daha gelişmiş geliştirme ortamlarına alışan programcılar için bazı özellikleri yeterli gelmeyebilir."
}
]
}'

Şimdi veriler de tam istediğim gibi oldu. Bu arada oldukça yetenekli bir kütüphaneymiş. std.json da bu şekilde direkt olarak yapılara veriyi gönderebiliyor mu bilmiyorum.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 16, 2016

sayfaVarMı'yı belirledikten sonra 'break;' yazabilirsin; boşuna devam etmeye gerek yok. (Ama bunu std.algorithm.canFind zaten yapıyor.)

Sanırım std.json öyle yetenekli değil ama bunu yapan başka JSON modülleri var.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]