Delphi Can

Orjinalini görmek için tıklayınız: Delphi ile Json Parse İşlemi
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Sayfalar: 1 2
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;
Ç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]
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
(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.
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.
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.
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;
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.
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
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)
Sayfalar: 1 2