Thread overview
JSON iç içe dizi okuma hatası
Mar 29, 2012
zafer
Mar 30, 2012
Salih Dinçer
Mar 30, 2012
Salih Dinçer
Mar 30, 2012
Salih Dinçer
Mar 30, 2012
zafer
Mar 30, 2012
zafer
Mar 30, 2012
zafer
March 29, 2012

Merhaba daha önceki konuda dosya okumayı anlamıştım ama yeni hazırladığım JSON dosyası içinde iç içe diziler tanımlama ihtiyacı oldu ama bir türlü okumayı başaramadım. Kodlar şöyle;

Alıntı:

>

{
"kelimeler" :
[
{
"seviye" : "temel",
"soru" : "book",
"cevaplar" :
[
{"cevap1" : "kitap"},
{"cevap2" : "yer ayırtmak"}
]
}
]
}

module main;

import std.stdio;
import std.conv;
import std.file;
import std.json;
import std.container;
import std.variant;
import std.traits;

/*
class ForumUyesi
{
   string kullaniciAdi;
   string adiSoyadi;
   int mesajSayisi;

   this(string kullaniciAdi, string adiSoyadi, int mesajSayisi)
   {
       this.kullaniciAdi = kullaniciAdi;
       this.adiSoyadi = adiSoyadi;
       this.mesajSayisi = mesajSayisi;
   }
}
*/

void main()
{
   //SList!(ForumUyesi) listeForumUyeleri;

   string icerik = to!string(read("uyeler.json"));

   JSONValue[string] uyeListesi = parseJSON(icerik).object;

   JSONValue[] uyeler = uyeListesi["kelimeler"].array;

   foreach (uyeBilgisi; uyeler)
   {
       JSONValue[string] uye = uyeBilgisi.object;

       writeln("seviye : ", uye["seviye"].str);
       writeln("soru : ", uye["soru"].str);

       JSONValue[] cevaplar = uye["cevaplar"].array;
       foreach (cevapJSON; cevaplar)
       {
           JSONValue[string] cevap = cevapJSON.object;

           // Alt satırda hata oluşuyor.
           writeln("cevaplar : ", cevap["cevap1"].str);
       }

       //auto forumUyeleri = new ForumUyesi(uye["KullaniciAdi"].str, uye["AdiSoyadi"].str, cast(int)uye["MesajSayisi"].integer);

       //listeForumUyeleri.insert(forumUyeleri);
       //writefln("-> %s | %s | %s", uye["KullaniciAdi"].str, uye["AdiSoyadi"].str, cast(int)uye["MesajSayisi"].integer);
   }

/*
   foreach (uye; listeForumUyeleri)
   {
       // insert elemanları listeye ters sırada ekliyor
       writefln("-> %s | %s | %s", uye.kullaniciAdi, uye.adiSoyadi, uye.mesajSayisi);
   }
*/
}

Hata aldığım ekran çıktısı şöyle;

Alıntı:

>

seviye : temel
soru : book
cevaplar : kitap
core.exception.RangeError@main(46): Range violation

41ED1C
41EB93
4021E1
408A4C
408A8B
40869B
439A49

Process returned 1 (0x1) execution time : 0.044 s
Press any key to continue.

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

March 30, 2012

Merhaba Zafer,

Veri aşağıdaki gibi olduğunda sorun düzeliyor. Farkı, fazladan kullanılan iki güzel parantez...

{
   "kelimeler" :
   [
       {
           "seviye" : "temel",
           "soru" : "book",
           "cevaplar" :
           [
               {
                   "cevap1" : "kitap",
                   "cevap2" : "yer ayırtmak"
               }
           ]
       }
   ]
}

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

March 30, 2012

Bu şekilde JSON kullanımı bana çok karışık geldi. Sanırım anlamayı zorlaştırıyor ve ne neyin içinde, ne neden türemiş açıkçası anlayamıyorum... :blush:

Bu ders için hem iki dosya üzerinde düzenleme yapmamak hem de olayı daha iyi kavrayabilmek için şöyle bir kod yazdım:
Alıntı:

>
> /*
>  json.d (30.03.2012)
> */
> import std.stdio, std.json;
>
> string veri ="{
>     \"kök\" : [{
>             \"sv1\" : \"Temel Seviye\",
>             \"sv2\" : \"İleri Seviye\",
>             \"dz1\" : [{
>                     \"el1\" : \"Birinci (1) eleman içindeyim...\",
>                     \"el2\" : \"İkinci (2) eleman içindeyim...\"
>             }]
>     }]
> }";
>
> void main() {
>     writeln(parseJSON(veri).
>                             object["kök"].array[0].
>                             object["dz1"].array[0].
>                             object["el1"].str);
> }
> ```

>
Sonuçta şöyle bir durum var; veri dosyadan okunsa bile string'e çevriliyor. Evet, çift tırnaktan dolayı fazladan işaret kullanıyoruz ve bu da kafa karıştırıyor. Ancak neyin nesne neyin dizi olduğunu anlamak açısından bu örnek galiba fena değil. Sanırım "nested loops" ile tüm veri çekip ekrana da yansıtılabilirdik.

Ayrıca verini yapı elemanlarına aktarılması da çok şirin görünüyor. Bu şekilde basit bir "initialize" işlevi ile kurulum gerçekleştirilir ve yazılım içinde programlayanı çok zorlamadan her yerden en anlaşılır şekilde veriye ulaşabilir. Sanırım JSON'u sevdim...:)

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

Evet ama bu sefer de "cevap2" gözardı ediliyor.

Zafer'in ilk gösterdiği dosyaya bakılırsa "cevaplar"ın içinde hangi türden nesne olduğu anlaşılmıyor. İlk nesnenin üyesinin ismi "cevap1", ikinci nesnenin üyesinin ismi "cevap2".

Bence çözüm, ya "cevaplar" yalnızca string içermeli, ya da üyenin ismi "cevap1" ve "cevap2" diye farklı değil, ikisinde de "cevap" olmalı.

Ali

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

March 30, 2012

Alıntı (Salih Dinçer):

>

Evet, çift tırnaktan dolayı fazladan işaret kullanıyoruz

D'nin ters bölü gerektirmeyen dizgi hazır değerlerini hatırlıyor musun? ;)

   writeln(`Çift tırnak var: "`);

Alıntı:

>

basit bir "initialize" işlevi ile kurulum gerçekleştirilir

Acaba türe 'this(JSONValue json)' diye bir kurucu eklense kolay olur mu?

Ali

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

March 30, 2012

Alıntı (acehreli):

>

Bence çözüm, ya "cevaplar" yalnızca string içermeli, ya da üyenin ismi "cevap1" ve "cevap2" diye farklı değil, ikisinde de "cevap" olmalı.

Son yaptığım JSON araştırmasının sonuçları;
Asında sanırım dizi "[]" ve nesne "{}" tanımlarımızdan kaynaklanan bir sorun var yani yukarıdaki örnekte ben bir dizi içine cevap1, cevap2 diye iki yeni nesne oluşturmuşum. Aslında ben orada cevaplar dizisine iki eleman eklemek istemiştim ama bu aslında şu şekilde oluyormuş;

Alıntı:

>

{
"kelimeler" :
[
{
"seviye" : "temel",
"soru" : "book",
"cevaplar" : ["kitap", "yer ayırtmak"]
}
]
}

Yani cevaplar içinde "{}" süslü parantezleri kullanarak yeniden nesne oluşturmak gerekmiyor. En azından benim yapım için. Büyük ihtimalle diğer türlüde çalışırdı ama seninde belirttiğin gibi "cevap1" anahtar sorunu oluyordu. Neyse çalışan kod şöyle;

module main;

import std.stdio;
import std.json;

void main()
{
   string veri = `{
                       "kelimeler" :
                       [
                           {
                               "seviye" : "temel",
                               "soru" : "book",
                               "cevaplar" : ["kitap", "yer ayırtmak"]
                           }
                       ]
                  }`;

   JSONValue[string] uyeListesi = parseJSON(veri).object;

   JSONValue[] kelimeler = uyeListesi["kelimeler"].array;

   foreach (kelimeNesnesi; kelimeler)
   {
       JSONValue[string] kelime = kelimeNesnesi.object;

       writeln("seviye : ", kelime["seviye"].str);
       writeln("soru : ", kelime["soru"].str);

       JSONValue[] cevaplar = kelime["cevaplar"].array;
       foreach (cevap; cevaplar)
       {
           writeln("cevaplar : ", cevap.str);
       }
   }

}

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

March 30, 2012

Alıntı (acehreli):

>

Acaba türe this(JSONValue json) diye bir kurucu eklense kolay olur mu?

Ali ben bunu anlamadım.

Salih yine güzel işler çıkarmışsın, senin sayende JSON konusunda farklı konuları araştırma fırsatı buldum. Aslında bir çok yerde bir JSON verisini direk bir nesneye eşitleme olanakları var. Sanırım bu JSON verisi içindeki "{}" nesne özelliğinden ve kütüphanenin özelliğinden kaynaklanıyor ama gerçekten çok güzel bir imkan.

Ben senin kodlardan da esinlenerek şöyle bişey yapmaya çalıştım ve bazı sorunlar var sanırım çalıştıramadım.

module main;

import std.stdio;
import std.json;

class Kisi
{
   public string kisiAdi;
   public string kisiSoyadi;

   this (JSONValue[string] eslemeTablosu)
   {
       kisiAdi = eslemeTablosu["kisiAdi"].str;
       kisiSoyadi = eslemeTablosu["kisiSoyadi"].str;
   }
}

void main()
{
   string kisiler= `{
                       "kisiAdi": "Zafer",
                       "kisiSoyadi": "Çelenk"
                    }`;

   //  Çalışıyor
   writefln("1 -> %s", parseJSON(kisiler).object["kisiAdi"].str);


   //  Çalışmıyor
   Kisi kisi = new Kisi(parseJSON(person).object);

   writefln("2 -> Adi: ½s,  Soyadi: %s", kisi.kisiAdi, kisi.kisiSoyadi);
}

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

March 31, 2012

Alıntı (acehreli):

>

Eğer JSONValue alırsa aldığının türü OBJECT'tir ve üyelerini onun içinde kendisi çeker çıkartır.

Haklısın Ali, JSONValue kullanarak daha üst düzey bir soyutlama yapmış oluruz, bu daha kullanışlı bir yapı demek tabi ki. Kodu şu hale getirdim. Aslında önceki çalışıyormuş ama "%s" yerine "½s" yazmışım :blush:

module main;

import std.stdio;
import std.json;

class Kisi
{
   public string kisiAdi;
   public string kisiSoyadi;

   public this (JSONValue kisiNesnesi)
   {
       JSONValue[string] kisiTablosu = kisiNesnesi.object;

       this.kisiAdi = kisiTablosu["kisiAdi"].str;
       this.kisiSoyadi = kisiTablosu["kisiSoyadi"].str;
   }
}

void main()
{
   string person = `{
                       "kisiAdi": "Zafer",
                       "kisiSoyadi": "Çelenk"
                    }`;

   Kisi kisi = new Kisi(parseJSON(person));

   writefln("2 -> Adi: %s,  Soyadi: %s", kisi.kisiAdi, kisi.kisiSoyadi);
}

Evet, görünen o ki basit bir Kelime nesnesine JSON verimi direk gönderebilir ve Kelime nesnesi ile program içinde işlerimi gerçekleştirebilirim diye düşünüyorum. Yada bir Kelime yapısı tanımlayıp Veri sınıfı içinden Kelime yapını mı alsam?

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

March 31, 2012

Alıntı (acehreli):

>

D'nin ters bölü gerektirmeyen dizgi hazır değerlerini hatırlıyor musun? ;)
Evet, bunu biliyordum ama o karakteri çıkaramamıştım. Sayende kopyaladım yapıştırdım vallahi...:)

Alıntı (acehreli):

>

Acaba türe 'this(JSONValue json)' diye bir kurucu eklense kolay olur mu?
Çok mantıklı görünüyor çünkü aklın yolu birdir. Kısa şeyleri seviyorum ve ne kolaysa onu yapmak istiyorum...

Alıntı (zafer):

>

Asında sanırım dizi "[]" ve nesne "{}" tanımlarımızdan kaynaklanan bir sorun var yani yukarıdaki örnekte ben bir dizi içine cevap1, cevap2 diye iki yeni nesne oluşturmuşum. Aslında ben orada cevaplar dizisine iki eleman eklemek istemiştim...
Anladım, bu durumda istediğimiz şeyi daha iyi ifade edebildiğimiz için artık daha az sorunla karşılaşacağız gibime geliyor...:)

Alıntı (zafer):

>

Salih yine güzel işler çıkarmışsın, senin sayende JSON konusunda farklı konuları araştırma fırsatı buldum. Aslında bir çok yerde bir JSON verisini direk bir nesneye eşitleme olanakları var. Sanırım bu JSON verisi içindeki "{}" nesne özelliğinden ve kütüphanenin özelliğinden kaynaklanıyor ama gerçekten çok güzel bir imkan.
Estağfurullah, ben sadece olaya basit yönden bakmaya çalıştım. Sen daha güzel işler başarıyorsun. Proje bittiğinde İngilizce eğitim konusunda bir yazılım daha eklenmiş olacak. Aslında bu konuda benim de küçük bir çalışmam vardı ama yarıda bırakmıştım. Amaç olabildiğince en basit yöntemle İngilizce öğretmek. Biraz tümden gelim yöntemini kullandım ama askıya aldım...:(

Başarılar...

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

March 30, 2012

Alıntı (zafer):

>

Alıntı (acehreli):

>

Acaba türe this(JSONValue json) diye bir kurucu eklense kolay olur mu?

Ali ben bunu anlamadım.

Gösterdiğin kodda 'this (JSONValue[string])' diye bir kurucu işlev var. Ben de onu kasdetmiştim ama acaba JSONValue mu alsa diye sesli düşünmüştüm. Eğer JSONValue alırsa aldığının türü OBJECT'tir ve üyelerini onun içinde kendisi çeker çıkartır.

Ali

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