Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi ile Json Parse İşlemi
#1
Merhabalar,
Bu aralar Json pars etmekle uğraşıyorum hazır elim değmişken forumumuzda da bir örneği bulunsun istedim.
Delphi Json ayıklama işleminin basit bir örneğini aşağıda paylaşıyorum iyi forumlar.

kbNGXy.png


37bvzr.png
{
"Delphi":{
"Konu":"Delphi ile Json Parse",
"Görüntüleme":"58",
"Tarih":"20.05.2017",
"Okuyanlar":[
{
"Adi":"Fesih ARSLAN",
"Gorevi":"Site Kurucusu",
"Memleket":"Erzurum"
},
{
"Adi":"Tugrul HELVACI",
"Gorevi":"Süper Moderatör",
"Memleket":"İstanbul Avrupa"
},
{
"Adi":"SimaWB",
"Gorevi":"Moderatör",
"Memleket":" İstanbul Anadolu"
}
]
}
}

var
 JSONObject, Delphi,  Okuyanlar: TJsonObject;
 OkuyanlarArray: TJSONArray;
 i:integer;
begin

  JSONObject         := TJsonObject.Create;
  Delphi             := TJsonObject.Create;

    try
     JSONObject.Parse(BytesOf(SynEdit1.Text), 0);
     Delphi.Parse(BytesOf(JSONObject.Values['Delphi'].ToString), 0);

       SynEdit2.Lines.Add('Konu: '          + Delphi.GetValue('Konu').ToString);
       SynEdit2.Lines.Add('Görüntüleme: '   + Delphi.GetValue('Görüntüleme').ToString);
       SynEdit2.Lines.Add('Tarih: '         + Delphi.GetValue('Tarih').ToString);

       OkuyanlarArray := Delphi.GetValue('Okuyanlar')  as TJSONArray;

         for I := 0 to OkuyanlarArray.Count-1 do
         begin
              SynEdit2.Lines.Add('' );
              SynEdit2.Lines.Add(' --- Okuyan id: '+inttostr(i)+' -- ' );
                Okuyanlar          := TJsonObject.Create;
                  try
                  Okuyanlar.Parse(BytesOf(OkuyanlarArray.Items[i].ToString), 0);
                  SynEdit2.Lines.Add('Adi: '         + Okuyanlar.GetValue('Adi').ToString);
                  SynEdit2.Lines.Add('Gorevi: '      + Okuyanlar.GetValue('Gorevi').ToString);
                  SynEdit2.Lines.Add('Memleket: '    + Okuyanlar.GetValue('Memleket').ToString);
                 finally
                      Okuyanlar.Free;
                 end;
         end;

    finally
        JSONObject.Free;
        Delphi.Free;
    end;
end;
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#2
Çok teşekkürler elinize sağlık.  Bu aralar bende ayıklama üzerine çalışıyorum.  Biraz karmaşık geldi ama sagolsun fesih bey yardimci oldu. Delimiter ile parçalara ayirdiktan sonra ayıklama kaldı ona da yogunluktan  bakamadım henüz.  Örneğin Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol sitesinde ki saatlik kayan verilerin yalnızca ilk değerini ayikliyabiliyorum diğer saatleri memoya aktaramadim  alt alta. Delimitersiz siralayabilir miyim?  Delimiter ile özel algoritma uyarlamam gerekli varsa daha uygun yol onu sonra gelistireyim . Biraz kolaya kaçıyorum  Kullandığım kodlar.

Function AradanSec(text, ilk, son: widestring): String;
begin
  Delete(text, 1, pos(ilk, text) + Length(ilk) - 1);
  Result := Copy(text, 1, pos(son, text) - 1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  webbrowser1.Navigate('https://www.epias.com.tr/');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  memo1.Clear;
  memo1.text := webbrowser1.OleObject.document.body.innerHTML;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  memo2.text := AradanSec(webbrowser1.OleObject.document.body.innerHTML,
    'rakam>', '</');
end;

[/quote]
Cevapla
#3
Emeğinize sağlık teşekkürler. 

Nasıl çalıştığını anlamak için, formuma iki adet memo bileşini ekleyip sizdeki syneditler ile değiştirdim. Memo1 paylaşmış olduğunuz json çıktısını ekleyip test etmek istediğimde   aşağıdaki gibi hata aldım. Memeo bileşeni UTF8 desteği yok mu, bu yüzden mi hata verdi ?

4aY6D0.png
Cevapla
#4
(11-01-2018, Saat: 02:38)Lord_Ares Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlEmeğinize sağlık teşekkürler. 

Nasıl çalıştığını anlamak için, formuma iki adet memo bileşini ekleyip sizdeki syneditler ile değiştirdim. Memo1 paylaşmış olduğunuz json çıktısını ekleyip test etmek istediğimde   aşağıdaki gibi hata aldım. Memeo bileşeni UTF8 desteği yok mu, bu yüzden mi hata verdi ?

4aY6D0.png

Merhaba,
Delphi 2009'dan beri tüm bileşenlerin hem UTF8 hem de UniCode desteği var.
Yine de sorunun bu durumdan kaynaklandığını düşünüyorsanız test etmek için aşağıdaki gibi bir string dönüşümü yapabilirsiniz. 
Memo2.Lines[0]:= UTF8ToString(Memo1.Lines[0]);
Hata oluşan satırı paylaşabilirseniz yardımcı olmaya çalışalım.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#5
Json parse işleminin nasıl yapıldığını öğrenmek anlamak istedim. Malum bu konuda türkçe kaynak yok. Arkadaşımızın paylaşmış olduğu örneği test ederken bende synedit olmadığı için onun kullanmış olduğu syneditler yerine memo kullanarak denediğimde yukarıdaki hatayı aldım.
Cevapla
#6
Sanırım Fesih bey'in demek istediği; Button1'in OnClick event'inde nasıl bir kod var, ilgili hata hangi satırda gerçekleşiyor ? Hata ile ilgili daha spesifik bilgi verebilir iseniz, çok daha hızlı ve tutarlı bir yardım yapılabilir sanıyorum.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#7
Sanırım kendimi ifade edemedim için ufak bir yanlış anlaşılma oldu Big Grin  Diğer mesajımda belirttiğim gibi Arkadaşın paylaşmış olduğu kodlamada Synedit kullanılmış. Bende synedit olmadığı için bunları memo ile değiştirdim. Json verilerini memo1 ekleyip aşağıdaki gibi kullandım. 
Araştırma yaparken Json verilerin oluşturulurken sanırım iki çeşidi var. Biri arrayler kullanıp okunabilen diğeri düz. Sizlerden ricam bana her iki çeşidin de nasıl okunduğunu öğretirmisiniz. Aşağıdaki iki farklı json koduna dikkat ederseniz ikinci json kodunda [ ] işaretleri kullanılmış.  ilkinde ise bu yapı yok. Bu şu demekmidir . [ işaret kullanılıyorsa okurken arrayler kullanmamız gereken yapı, kullanılmadıysa düz stringlere okumamız gereken yapı ?

Tuğrul hocam, json hakkında paylaştığınız bir yazınız veya makaleniz varsa benle paylaşıp , bana yol gösterir misiniz. Bu yapının ne olduğunu nasıl kullanıldığını öğrenmek istiyorum.

Düz olanın json yapısı 

{
   "BTC_BCN": {
       "last": "0.00000074",
       "lowestAsk": "0.00000075"       
   },
   "BTC_BELA": {
       "last": "0.00003291",
       "lowestAsk": "0.00003296",
   }

Arrayler kulllanılarak okunan json yapısı

{
"Delphi":{
"Konu":"Delphi ile Json Parse",
"Görüntüleme":"58",
"Tarih":"20.05.2017",
"Okuyanlar":[
{
"Adi":"Fesih ARSLAN",
"Gorevi":"Site Kurucusu",
"Memleket":"Erzurum"
},
{
"Adi":"Tugrul HELVACI",
"Gorevi":"Süper Moderatör",
"Memleket":"İstanbul Avrupa"
},
{
"Adi":"SimaWB",
"Gorevi":"Moderatör",
"Memleket":" İstanbul Anadolu"
}
]
}
}

 


Benim kullanmış olduğum button1 kodu

procedure TForm1.Button1Click(Sender: TObject);
var
JSONObject, Delphi,  Okuyanlar: TJsonObject;
OkuyanlarArray: TJSONArray;
i:integer;

begin

 JSONObject         := TJsonObject.Create;
 Delphi             := TJsonObject.Create;

   try
    JSONObject.Parse(BytesOf(Memo1.Text), 0);
    Delphi.Parse(BytesOf(JSONObject.Values['Delphi'].ToString), 0);

      Memo2.Lines.Add('Konu: '          + Delphi.GetValue('Konu').ToString);
      Memo2.Lines.Add('Görüntüleme: '   + Delphi.GetValue('Görüntüleme').ToString);
      Memo2.Lines.Add('Tarih: '         + Delphi.GetValue('Tarih').ToString);

      OkuyanlarArray := Delphi.GetValue('Okuyanlar')  as TJSONArray;

        for I := 0 to OkuyanlarArray.Count-1 do
        begin
             Memo2.Lines.Add('' );
             Memo2.Lines.Add(' --- Okuyan id: '+inttostr(i)+' -- ' );
               Okuyanlar          := TJsonObject.Create;
                 try
                 Okuyanlar.Parse(BytesOf(OkuyanlarArray.Items[i].ToString), 0);
                 Memo2.Lines.Add('Adi: '         + Okuyanlar.GetValue('Adi').ToString);
                 Memo2.Lines.Add('Gorevi: '      + Okuyanlar.GetValue('Gorevi').ToString);
                 Memo2.Lines.Add('Memleket: '    + Okuyanlar.GetValue('Memleket').ToString);
                finally
                     Okuyanlar.Free;
                end;
        end;

   finally
       JSONObject.Free;
       Delphi.Free;
   end;
end;
Cevapla
#8
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol bilgilere bir göz gezdirmenizde büyük fayda olacaktır. Yine de anlaşılmayan bir husus olur ise elimizden geldiğince yardımcı olmaya çalışırız.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#9
Teşekkürler. Burayı incelemiştim. Ben delphi tarafında bu iki farklı yapıyı nasıl okumam gerektiğini bilmediğim için öğrenmek istemiştim ama vazgeçtim Smile
Cevapla
#10
Fesih Bey'in yazdığına dikkat etmemişsiniz sanırım. Bence de sorun Unicode ile ilgili.
BytesOf yerine şunu dener misiniz:
TEncoding.UTF8.GetBytes(Memo1.Text)
There's no place like 127.0.0.1
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi Uygulama Güvenliği hyperxman 12 375 31-03-2018, Saat: 00:29
Son Yorum: mcuyan
  Bu json formatı nasıl okunur? canbir 5 233 23-03-2018, Saat: 17:22
Son Yorum: barisatalay
  Delphi Sql Tarih Sorunu Pimapen_Nuri 15 544 14-03-2018, Saat: 17:29
Son Yorum: Pimapen_Nuri
  Delphi 10.2.2 Tokyo narkotik 9 372 09-03-2018, Saat: 13:43
Son Yorum: engerex
  Delphi 10.2 Fast Report Install Error narkotik 5 193 01-03-2018, Saat: 15:02
Son Yorum: narkotik



Konuyu Okuyanlar: 1 Ziyaretçi