Forum: Ders Arası RSS
asdf json kullanarak dosyaya yazma
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 894 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: asdf json kullanarak dosyaya yazma
asdf kütüphanesi 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.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İ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
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 894 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
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
    }
}
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 894 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
        }
    ]
}
erdem (Moderatör) #6
Üye Tem 2009 tarihinden beri · 894 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
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:
Forum: Ders Arası RSS
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-03-23, 11:26:17 (UTC -07:00)