10 Eylül 2012 Pazartesi

TDataset ToJSONData

{ İsmail Kocacan }
unit uJsonHelper;

interface

uses

  Data.DB,
  System.SysUtils,
  Data.DBXJSON,
  Data.DBXJSONCommon,
  Data.DBXJSONReflect;

type

  TDatasetJSONHelper = class helper for TDataset
  public
    function ToJSONData: TJSONArray;
  end;

implementation

{ TDatasetJSONHelper }
function TDatasetJSONHelper.ToJSONData: TJSONArray;
var
  jso: TJSONObject;
  jsa: TJSONArray;
  jsp: TJsonPair;
  J: Integer;
begin
  Self.Open;
  jsa := TJSONArray.Create();
  while not Self.Eof do
  begin
    jso := TJSONObject.Create();
    for J := 0 to FieldCount - 1 do
      jso.AddPair(TJsonPair.Create(Fields[J].DisplayName, Fields[J].Value));
    jsa.AddElement(jso);
    Self.Next;
  end;
  Self.Close;
  Result := jsa;
end;

end.
TDataset sınıfına uzanım fonksiyonu olarak yazmamızın sebebi; TDataset sınıfı kullanılarak genişletilen(kalıtılan) üst sınıflarda da,kolayca kullanabilelim diyedir.
 Örneğin ;
 SQLQuery1.ToJSONData;
 ADOQuery1.ToJSONData;
 UniQuery1.ToJSONData;
 BilmemNeQuery1.ToJSONData;

 Şeklinde kullanabilmek mümkün olacaktır.
 Örnek Çıktı
{
 "result":
  [
   {"RID":"3","FIRSTNAME":"serdar","LASTNAME":"sezer"},
   {"RID":"2","FIRSTNAME":"kemal","LASTNAME":"bayat"},
   {"RID":"1","FIRSTNAME":"ismail","LASTNAME":"kocacan"}
  ]
}
Yukarıdaki çıktıyı alabilmek için bir takım düzenlemeler yapmak gerekiyor.Bu düzenlemeleri Datasnap REST Ve JSON Formatı Hakkında konusunda bulabilirsiniz.

2 yorum:

  1. İsmail hocam,
    Çalışmalarınızdan dolayı çok teşekkür ederim.

    Yukarıdaki kodu unit olarak oluşturduğumda aşağıdaki hatayı alıyorum..
    ------------------------------------------------------
    [dcc32 Error] uJsonHelper.pas(38): E2251 Ambiguous overloaded call to 'Create'
    System.JSON.pas(530): Related method: constructor TJSONPair.Create(const string; const Boolean);
    System.JSON.pas(524): Related method: constructor TJSONPair.Create(const string; const Double);
    System.JSON.pas(506): Related method: constructor TJSONPair.Create(const string; const string);
    ----------------------------------------------------

    koddaki
    jso.AddPair(TJsonPair.Create(Fields[J].DisplayName, Fields[J].Value));
    satırı pasif ettiğimde hata gidiyor.. Ama bu sefer çalışmıyor..
    radstudio 11 kullanıyorum..
    ilginden dolayı teşekkür ederim.

    YanıtlaSil
  2. Çözüldü:
    Çalışan kod;

    { İsmail Kocacan }
    unit uJsonHelper;

    interface

    uses

    Data.DB,
    System.SysUtils,
    System.JSON,
    Data.DBXJSON,
    Data.DBXJSONCommon,
    Data.DBXJSONReflect;

    type

    TDatasetJSONHelper = class helper for TDataset
    public
    function ToJSONData: TJSONArray;
    end;

    implementation

    { TDatasetJSONHelper }
    function TDatasetJSONHelper.ToJSONData: TJSONArray;
    var
    jso: TJSONObject;
    jsa: TJSONArray;
    jsp: TJsonPair;
    J: Integer;
    begin
    Self.Open;
    jsa := TJSONArray.Create();
    while not Self.Eof do
    begin
    jso := TJSONObject.Create();
    for J := 0 to FieldCount - 1 do
    jso.AddPair(TJsonPair.Create(Fields[J].DisplayName, Fields[J].Text));
    jsa.AddElement(jso);
    Self.Next;
    end;
    Self.Close;
    Result := jsa;
    end;

    end.

    YanıtlaSil