Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
delphi ile json parseleme
#1
merhabalar forumda yeniyim bisorum olacaktı 
// 20180622173915
// http://e2user.enigma2ipk.com/stalker_por...assword=b2

{
  "user_info": {
    "username": "b1",
    "password": "b2",
    "status": "Active",
    "exp_date": null,
    "max_connections": "2"
  },
  "server_info": {
    "url": "77.perfecttv.us",
    "port": "8181",
    "server_protocol": "http"
  },
  "categories": {
    "live": [
      {
        "category_id": "585",
        "category_name": "Sky Germany",
        "parent_id": 0
      },
      {
        "category_id": "586",
        "category_name": "DE Ulusal",
        "parent_id": 0
      },
      {
        "category_id": "587",
        "category_name": "Spor int.",
        "parent_id": 0
      },
      {
        "category_id": "588",
        "category_name": "Scandinavia",


böyle bir jsonu parselemek istiyorum ama parseliyemedim
örneğin usernamedeki b1ibi dğeişkene atmak isitoyrum yardımcı olurmusunuz şimdiden teşekkürler
WWW
Cevapla
#2
procedure TForm1.cxButton1Click(Sender: TObject);
var
JSonObj: TJSonObject;
js:TJSonValue;
deger:string;
begin
  JSonObj := TJSonObject.Create;
   js:=JSonObj.ParseJSONValue(memo2.Text);//jsonu memo2'den alıyoruz.
  js:=(Js as TJSONObject).Get('user_info').JSONValue;
  deger:=(js as TJSONObject).Get('username').JSONValue.value;
  memo1.Lines.Add(deger); //bulduğumuz değer
  freeandnil(js);
  freeandnil(jsonobj);
end;

Bu jsonu tam anladım diyorum, bambaşka birşey çıkıyor, başka bir şekilde çözüm gerekiyor. Anladığım bu json okuma olayında tek bir doğru yok.
Bu da başka bir şekil:

procedure TForm1.cxButton1Click(Sender: TObject);
var
JSONObject, js: TJsonObject;
begin
 JSONObject         := TJsonObject.Create;
 js             := TJsonObject.Create;
      JSONObject.Parse(BytesOf(memo2.Text), 0);
    js.Parse(BytesOf(JSONObject.Values['user_info'].ToString), 0);
  memo1.Lines.Add(js.GetValue('username').ToString);
  freeandnil(js);
  freeandnil(JSONObject);
end;
Cevapla
#3
(22-06-2018, Saat: 22:47)canbir Adlı Kullanıcıdan Alıntı:
procedure TForm1.cxButton1Click(Sender: TObject);
var
JSonObj: TJSonObject;
js:TJSonValue;
deger:string;
begin
  JSonObj := TJSonObject.Create;
   js:=JSonObj.ParseJSONValue(memo2.Text);//jsonu memo2'den alıyoruz.
  js:=(Js as TJSONObject).Get('user_info').JSONValue;
  deger:=(js as TJSONObject).Get('username').JSONValue.value;
  memo1.Lines.Add(deger); //bulduğumuz değer
  freeandnil(js);
  freeandnil(jsonobj);
end;

Bu jsonu tam anladım diyorum, bambaşka birşey çıkıyor, başka bir şekilde çözüm gerekiyor. Anladığım bu json okuma olayında tek bir doğru yok.
Bu da başka bir şekil:

procedure TForm1.cxButton1Click(Sender: TObject);
var
JSONObject, js: TJsonObject;
begin
 JSONObject         := TJsonObject.Create;
 js             := TJsonObject.Create;
      JSONObject.Parse(BytesOf(memo2.Text), 0);
    js.Parse(BytesOf(JSONObject.Values['user_info'].ToString), 0);
  memo1.Lines.Add(js.GetValue('username').ToString);
  freeandnil(js);
  freeandnil(JSONObject);
end;

merhaba öncelikle cevap için çok teşşekürler bu json komponentimi indirmemiz gerekiyoruz  TJSonObject bu ne anlama geliyor
WWW
Cevapla
#4
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 TRESTClientTRESTRequest 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;
 

Json1.jpg

Not: Bu örnek tüm platformlarda çalışacak şekilde kodlanmıştır.
Cevapla
#5
Class hazırlamadan content.Server_info.url şeklinde verilere ulaşamaz mıyız?

(23-06-2018, Saat: 08:33)arsl01 Adlı Kullanıcıdan Alıntı:
(22-06-2018, Saat: 22:47)canbir Adlı Kullanıcıdan Alıntı:
procedure TForm1.cxButton1Click(Sender: TObject);
var
JSonObj: TJSonObject;
js:TJSonValue;
deger:string;
begin
  JSonObj := TJSonObject.Create;
   js:=JSonObj.ParseJSONValue(memo2.Text);//jsonu memo2'den alıyoruz.
  js:=(Js as TJSONObject).Get('user_info').JSONValue;
  deger:=(js as TJSONObject).Get('username').JSONValue.value;
  memo1.Lines.Add(deger); //bulduğumuz değer
  freeandnil(js);
  freeandnil(jsonobj);
end;

Bu jsonu tam anladım diyorum, bambaşka birşey çıkıyor, başka bir şekilde çözüm gerekiyor. Anladığım bu json okuma olayında tek bir doğru yok.
Bu da başka bir şekil:

procedure TForm1.cxButton1Click(Sender: TObject);
var
JSONObject, js: TJsonObject;
begin
 JSONObject         := TJsonObject.Create;
 js             := TJsonObject.Create;
      JSONObject.Parse(BytesOf(memo2.Text), 0);
    js.Parse(BytesOf(JSONObject.Values['user_info'].ToString), 0);
  memo1.Lines.Add(js.GetValue('username').ToString);
  freeandnil(js);
  freeandnil(JSONObject);
end;

merhaba öncelikle cevap için çok teşşekürler bu json komponentimi indirmemiz gerekiyoruz  TJSonObject bu ne anlama geliyor

usese json eklemeniz gerekiyor.
Cevapla
#6
(23-06-2018, Saat: 20:01)canbir Adlı Kullanıcıdan Alıntı: Class hazırlamadan content.Server_info.url şeklinde verilere ulaşamaz mıyız?
Bunu yapan harici bileşenler/sınıflar var. Fakat onlar da arka planda her bir obje için ayrı bir sınıf/record/property oluşturuyorlar.
En doğrusu harici bileşen/sınıf kullanmadan entegrasyon yapmaktır.
Cevapla
#7
Json formatına diyecek birşeyim yok ancak keşke okumak için genel bir çözüm de olsa, mesela browserlar jsona özel tanımlama yapmadan, her türlü json formatını okuyabiliyorlar.
Bazen jsonu doğru okusam ve istediğim verileri tam olarak alsam da bu defa memory leakla uğraşmak zorunda kalıyorum. Anlamadığım bir şekilde tüm json tanımlamalarını fonsiyon sonunda FreeAndNil yapsam da hafıza kaçağı devam ediyor. Bu yüzden çoğu zaman json formatını okumak yerine, pos ve copy ile istediğim şeyi alıyorum. Vermiş olduğunuz örnek şu anda bana karışık gelse de daha ciddi projelerimde sanırım uygulamak için çabalayacağım. Umarım kitabınızda json formatına biraz detaylı yer vermişsiniz...
Cevapla
#8
(24-06-2018, Saat: 01:20)canbir Adlı Kullanıcıdan Alıntı: Json formatına diyecek birşeyim yok ancak keşke okumak için genel bir çözüm de olsa, mesela browserlar jsona özel tanımlama yapmadan, her türlü json formatını okuyabiliyorlar.
Bazen jsonu doğru okusam ve istediğim verileri tam olarak alsam da bu defa memory leakla uğraşmak zorunda kalıyorum. Anlamadığım bir şekilde tüm json tanımlamalarını fonsiyon sonunda FreeAndNil yapsam da hafıza kaçağı devam ediyor. Bu yüzden çoğu zaman json formatını okumak yerine, pos ve copy ile istediğim şeyi alıyorum. Vermiş olduğunuz örnek şu anda bana karışık gelse de daha ciddi projelerimde sanırım uygulamak için çabalayacağım. Umarım kitabınızda json formatına biraz detaylı yer vermişsiniz...

Memoryleak sorununuzun çözümü şu link olabilir mi:

https://stackoverflow.com/questions/4309...-in-header
Cevapla
#9
Herkez çok çok teşekkürlerbaşardım sayenizde
WWW
Cevapla
#10
Tebrikler. Çözümünü de paylaşırsan sonraki okuyucular da bundan faydalanabilir...
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  delphi 10.4 deutsch1988 0 71 Dün, Saat: 11:46
Son Yorum: deutsch1988
  Delphi virus gibi deutsch1988 11 491 12-04-2024, Saat: 17:36
Son Yorum: deutsch1988
  Delphi 7 Unrar mcuyan 12 674 19-03-2024, Saat: 10:30
Son Yorum: frmman
Lightbulb Delphi 7zip Password lü Dosya Sıkıştırma ve Açma + Bonus RAR5 Desteği frmman 6 322 16-03-2024, Saat: 17:55
Son Yorum: delphi.developer
  delphi 12 ile TFileStream çalışmıyor aegean 5 527 05-03-2024, Saat: 22:23
Son Yorum: aegean



Konuyu Okuyanlar: 1 Ziyaretçi