JSON ile Veri Okumak ve Parselemek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

JSON ile Veri Okumak ve Parselemek

Mesaj gönderen NewMember »

Arkadaşlar Merhaba;
Delphi ile bir web sitesinden JSON veri okumam gerekiyor.Nette çok araştırdım.Genelde Parse ile ilgili bilgiler var.
Ama veri okuma ile ilgili bir yol alamadım.Bulduğum örneklerden de yola çıkarak bir aşama elde edemedim.

Örneğin Şöyle bir linkkten veriyi delphi projemde alıp parselemek istiyorum.

http://srv1.xxxtakip.com.tr/XXXjson/Rep ... 2017-01-06 00:00&LastDate=2017-01-06 23:59

Aşağıdaki gibi bir veri dönecek.

Kod: Tümünü seç

[{"GpsTime":"6.1.2017 00:06:00","Latitude":"40.152826666666666666666666667","Longitude":"26.411841666666666666666666667","Speed":0,"Ignition":"Kapalı","Rolanti":"Yok","Address":"Ali Yasin Cad. Veşi Pasa/ Ankara Türkiye","ImgUrl":"GR120.PNG"}]
Burda parseleyip işte aracın koordinatlarını, adresini vs alıcam.

Yardımcı olabilirmisiniz?
Teşekkürler....
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: JSON ile Veri Okumak ve Parselemek

Mesaj gönderen ertank »

Merhaba,

REST kullanan Web Servisler birden fazla şekilde sizden parametre gönderimi isteyebilirler.

1- Standart bir REST Web Servisi aşağıdaki şekilde kullanabilirsiniz.
Bunu uygulamanıza aşağıdaki bileşenleri ekleyip birbirleri ile ve web servis ile ilgili ayarlamaları yaptıktan sonra gerçekleştirebilirsiniz.
TRESTClient
TRESTRequest
TRESTResponse

RESTClient.Url bilgisini doldurmanız gerekli.
RESTRequest.Params içini doldurmanız gerekli

Bunları yaptıktan sonra Delphi içinde RESTRequest üzerinde fare sağ tuş ile tıklayın ve Execute seçeneğini seçin. Eğer girdiğiniz bilgiler doğru ise RESTRequest.Content içinde Web Servis cevabını bulabilirsiniz.

2- Diğer taraftan bazı REST Web Servisler talepte bulunurken parametre kullanımı yerine parametreleri bir json string şeklinde isteyebilirler sizden. Bu durumda yukarıdaki yöntemi kullanamazsınız. Bu tür işlemler için aşağıdaki gibi bir kod yazmanız gerekecektir:

Kod: Tümünü seç

uses
  IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP;

uses
  IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP;

procedure TForm1.Button1Click(Sender: TObject);
var
  Response, JsonString: string;
  lRequest: TStringStream;
  Http: TIdHTTP;
begin
  lRequest := TStringStream.Create(JsonString, TEncoding.UTF8);
  try
    Screen.Cursor := crHourGlass;
    Http := TIdHTTP.Create(nil);
    try
      Http.Request.ContentType := 'application/json';
      Http.Request.CharSet     := 'utf-8';
      try
        // Sorgulama yapan bileşen
        Response := Http.Post('url', lRequest);
      except
        on E: Exception do
        begin
          ShowMessage('*** İletişim hatası: ' + E.Message);
        end;
      end;
    finally
      Http.Free();
    end;
  finally
    lRequest.Free();
  end;
end;
Bu noktada örnekler Indy10 üzerinden verilmiştir. Eski sürüm kullanıyor iseniz aşağıdaki linkten son sürümünü indirebilirsiniz.
http://www.indyproject.org/Sockets/wiza ... rd.EN.aspx

Sizin verdiğiniz örnek daha çok 1 numaralı kullanım şekline uygun gözüküyor. Eğer Delphi 10.1 Update 2 kullanıyor iseniz. Delphi'nin bu sürümünde 1 numaralı kullanım şekilden kaynaklı bir hafıza kaçağı vardır. RESTRequest.Execute() iki kez çalıştırılıp her iki çalıştırmada da cevap alınır ise (boş bilgi dışında bir RESTResponse.Content içi dolar ise) uygulama kapatıldığında hafıza kaçağı oluşmaktadır.

Bu problemin Embarcadero tarafından ileriki Delphi sürümlerinde düzeltilmesini beklemek zorundayız.
Cevapla