سلام.
در حال طراحی وب سروری بودم که چون برای کلاینتش که اندروید بود ، مجبور بودم از فرمت Json استفاده کنم ، هر چی نتو زیرو رو کردم، چیز به درد بخوری پیدا نکردم.
البته بودند کامپوننت و ابزارهایی برای اینکار. که بیشترشون از دلفی های نسخه های بالا پشتیبانی میکردند و به درد من نمیخورد.
اومدمو برا خودم یه کد با حال زدم و خروجی کوئریم رو در قالب جیسون(مزحک) در اوردم.
البته کارم عجله ایه و این کد کارمو راه انداخت. ایشالا دست حاج یوسف خلوت شد ، کمکم میکنه و تبدیلش میکنیم به کامپوننت که مستقیم به دیتا ست وصل بشه و حالشو ببریم.
البته بگم، نیایید بگید فلان کامپوننت و فلان روش بودا. میدونم عزیزان. حال کردم خودم طراحی کنم
برنامه رو میتونید از این لینک بگیرید.
رمزشم هست:
123321Mask
البته اینم بگم که روشی که بنده در این سمپل استفاده کردم ،روشی هست که دست برنامه نویس بازه و حتی میتونه از بیرون بهش مقدار پاس بده.یعنی فیلدهایی که نیازه که ازشون گزارش به فرمت جیسون گرفته بشه، رو میتونید بصورت استرینگ از بیرون برنامه لود کنید.
کد زیر هم روی نسخه دلفی من جواب داد. اما من محدودیت هایی از لحاظ داینامیک بودن، رو درش دیدم که بیخیالش شدم و خودم مجدد چرخ رو به روش خودم اختراع کردم
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DBXJSON, DBXJSONReflect;
type
TPerson = class(TObject)
public
Name: String;
Password: String;
Age: Integer;
end;
type
TForm1 = class(TForm)
Button1: TButton;
Memo2: TMemo;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
function ObjectToJSON(AData: TObject): TJSONValue;
function JSONToObject(AJSONValue: TJSONValue): TObject;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
lPerson: TPerson;
lJSONValue: TJSONValue;
begin
Memo2.Lines.Clear;
lPerson := TPerson.Create;
lPerson.Name := 'Hezihang';
lPerson.Password := '123';
lPerson.Age := 23;
lJSONValue := ObjectToJSON(lPerson);
FreeAndNil(lPerson);
Memo2.Lines.Add(lJSONValue.ToString);
lJSONValue.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
lPerson: TPerson;
lJSONValue: TJSONValue;
begin
Memo1.Clear;
lJSONValue := TJSONObject.ParseJSONValue(Memo2.Text);
lPerson := JSONToObject(lJSONValue) as TPerson;
lJSONValue.Free;
Memo1.Lines.Add('Name: ' + lPerson.Name);
Memo1.Lines.Add('Password: ' + lPerson.Password);
Memo1.Lines.Add('Age: ' + IntToStr(lPerson.Age));
lPerson.Free;
end;
function TForm1.JSONToObject(AJSONValue: TJSONValue): TObject;
var
lUnMarshal: TJSONUnMarshal;
begin
lUnMarshal := TJSONUnMarshal.Create();
try
Result := lUnMarshal.Unmarshal(AJSONValue);
finally
FreeAndNil(lUnMarshal);
end;
end;
function TForm1.ObjectToJSON(AData: TObject): TJSONValue;
var
lMarshal: TJSONMarshal;
begin
lMarshal := TJSONMarshal.Create();
try
Result := lMarshal.Marshal(AData);
finally
FreeAndNil(lMarshal);
end;
end;
end.