Merhaba,
TJSonObject, System.JSON içerisinde yer alan bir sınıftır.
@
canbir 'in örneklediği yöntem en kolay ve sade olanıdır. Bu şekilde bir temel JSON sınıfı oluşturup kullanabilirsiniz.
Referans olarak vermiş olduğunuz URL adresindeki gibi detaylı ve komplex bir yapı için daha hızlı bir yöntem önerim olacak.
REST.Json Unit'inde yer alan TJson sınıfının
ObjectToJsonString ve
JsonToObject metodlarını kullanmak.
Bu yöntem parametre olarak göndermiş olduğunuz JSon'u bir sınıfa dönüştürerek, daha az kod kullanarak JSON içindeki veriye daha hızlı ulaşmanızı sağlayacaktır.
Anlatacağım örneği
daha iyi anlayabilmek adına aşağıdaki araştırma/bilgilere sahip olmanızda fayda vardır.
1- ObjectToJsonString ve JsonToObject metodları hakkında ön bilgi almanızı öneriyorum. (Bunun için formda kısa bir araştırma yapabilirsiniz)
2- TRESTClient, TRESTRequest ve TRESTResponse bileşenleri hakkında da ön bilgiye sahip olmanız gerekir.
3- Object Pascal sınıf yapıları hakkında temel bilgi seviyesine sahip olmanız gerekir.
Bu tip sabit yapılı REST API veri servisleri için aşağıdaki gibi harici bir Unit oluşturup tüm sınıfları orada tanımlayalım.
Örnek Unit yapısı:
unit uEnigmaAPI;
interface
uses Generics.Collections, Rest.Json;
type
TCanliYayin = class
private
FCategory_id: String;
FCategory_name: String;
FParent_id: Extended;
public
property category_id: String read FCategory_id write FCategory_id;
property category_name: String read FCategory_name write FCategory_name;
property parent_id: Extended read FParent_id write FParent_id;
function ToJsonString: string;
class function FromJsonString(AJsonString: string): TCanliYayin;
end;
TKategori = class
private
FLive: TArray<TCanliYayin>;
public
property live: TArray<TCanliYayin> read FLive write FLive;
destructor Destroy; override;
function ToJsonString: string;
class function FromJsonString(AJsonString: string): TKategori;
end;
TSunucuBilgi = class
private
FPort: String;
FServer_protocol: String;
FUrl: String;
public
property port: String read FPort write FPort;
property server_protocol: String read FServer_protocol
write FServer_protocol;
property url: String read FUrl write FUrl;
function ToJsonString: string;
class function FromJsonString(AJsonString: string): TSunucuBilgi;
end;
TKullanici = class
private
FMax_connections: String;
FPassword: String;
FStatus: String;
FUsername: String;
public
property max_connections: String read FMax_connections
write FMax_connections;
property password: String read FPassword write FPassword;
property status: String read FStatus write FStatus;
property username: String read FUsername write FUsername;
function ToJsonString: string;
class function FromJsonString(AJsonString: string): TKullanici;
end;
TEnigmaAPI = class
private
FCategories: TKategori;
FServer_info: TSunucuBilgi;
FUser_info: TKullanici;
public
property Categories: TKategori read FCategories write FCategories;
property Server_info: TSunucuBilgi read FServer_info write FServer_info;
property user_info: TKullanici read FUser_info write FUser_info;
constructor Create;
destructor Destroy; override;
function ToJsonString: string;
class function FromJsonString(AJsonString: string): TEnigmaAPI;
end;
implementation
{ TCanliYayin }
function TCanliYayin.ToJsonString: string;
begin
result := TJson.ObjectToJsonString(self);
end;
class function TCanliYayin.FromJsonString(AJsonString: string): TCanliYayin;
begin
result := TJson.JsonToObject<TCanliYayin>(AJsonString)
end;
{ TKategori }
destructor TKategori.Destroy;
var
LliveItem: TCanliYayin;
begin
for LliveItem in FLive do
LliveItem.Free;
inherited;
end;
function TKategori.ToJsonString: string;
begin
result := TJson.ObjectToJsonString(self);
end;
class function TKategori.FromJsonString(AJsonString: string)
: TKategori;
begin
result := TJson.JsonToObject<TKategori>(AJsonString)
end;
{ TSunucuBilgi }
function TSunucuBilgi.ToJsonString: string;
begin
result := TJson.ObjectToJsonString(self);
end;
class function TSunucuBilgi.FromJsonString(AJsonString: string)
: TSunucuBilgi;
begin
result := TJson.JsonToObject<TSunucuBilgi>(AJsonString)
end;
{ TKullanici }
function TKullanici.ToJsonString: string;
begin
result := TJson.ObjectToJsonString(self);
end;
class function TKullanici.FromJsonString(AJsonString: string)
: TKullanici;
begin
result := TJson.JsonToObject<TKullanici>(AJsonString)
end;
{ TEnigmaAPI }
constructor TEnigmaAPI.Create;
begin
inherited;
FUser_info := TKullanici.Create();
FServer_info := TSunucuBilgi.Create();
FCategories := TKategori.Create();
end;
destructor TEnigmaAPI.Destroy;
begin
FUser_info.Free;
FServer_info.Free;
FCategories.Free;
inherited;
end;
function TEnigmaAPI.ToJsonString: string;
begin
result := TJson.ObjectToJsonString(self);
end;
class function TEnigmaAPI.FromJsonString(AJsonString: string): TEnigmaAPI;
begin
result := TJson.JsonToObject<TEnigmaAPI>(AJsonString)
end;
end.
Kullanımı için;
1- Form üzerine birer adet
TRESTClient,
TRESTRequest ve
TRESTResponse nesnesi yerleştirin.
2 -RESTRequest1'in
Response özelliğine
RESTResponse1'i atayın.
3 -RESTClient1'ın
BaseURL özelliğine
http://e2user.enigma2ipk.com/stalker_por...ass_pc.php yazın.
4 -Ana formun
OnShow olayında RESTRequest1'in parametrelerini aşağıdaki gibi tanımlayın.
procedure TForm1.FormShow(Sender: TObject);
begin
With DmEnigma do
begin
RESTRequest1.Params.Clear;
RESTRequest1.Client := RESTClient1;
RESTRequest1.AddParameter('username', 'b1',
TRESTRequestParameterKind.pkGETorPOST,
[TRESTRequestParameterOption.poDoNotEncode]);
RESTRequest1.AddParameter('password', 'b2',
TRESTRequestParameterKind.pkGETorPOST,
[TRESTRequestParameterOption.poDoNotEncode]);
end;
end;
Not: TRESTClient, TRESTRequest ve TRESTResponse gibi Non-Visual nesneleri genellikle bir DataModule üzerinde kullanmanız daha iyi olacaktır. Örnekte bu amaçla bir DataModule (DmEnigma) kullanılmıştır.
5- Uses bölümünde kullanılan referanslar:
Uses
REST.Types, uEnigmaAPI, uDMEnigma, REST.Client;
6- Oluşturduğumuz harici Unit sınıfından örnek veri almak:
procedure TForm1.Button1Click(Sender: TObject);
var
EnigmaAPI: TEnigmaAPI;
I: Integer;
begin
DmEnigma.RESTRequest1.Execute;
EnigmaAPI := TEnigmaAPI.FromJsonString(DmEnigma.RESTResponse1.Content);
Memo1.Lines.Add('Sunucu URL Adresi: ' + EnigmaAPI.Server_info.url);
Memo1.Lines.Add('Sunucu Portu: ' + EnigmaAPI.Server_info.port);
Memo1.Lines.Add('Sunucu Protokolü: ' + EnigmaAPI.Server_info.server_protocol);
Memo1.Lines.Add('');
for I := 0 to Length(EnigmaAPI.Categories.live) - 1 do
begin
Memo1.Lines.Add('---------------------------');
Memo1.Lines.Add((i + 1).toString + '.Kategori Id: ' +
EnigmaAPI.Categories.live[i].category_id);
Memo1.Lines.Add((i + 1).toString + '.Kategori Adı: ' +
EnigmaAPI.Categories.live[i].category_name);
Memo1.Lines.Add((i + 1).toString + '.Parent Id: ' +
EnigmaAPI.Categories.live[i].parent_id.toString);
end;
end;
Not: Bu örnek tüm platformlarda çalışacak şekilde kodlanmıştır.