Ever wanted to take an Object into a format that is easily persisted and back? Well now you can. New in XE6 is the REST.JSON unit. This allows you access to TJSON a class with some very helpful class methods. Using TJSON you can convert an object to a JSON string and back with a little help from generics along the way.
The following code uses a class called TFoo that has a Foo and a Fee property (string and Integer) Using TJson you can then see how to covert the object to a string and back ready for storage, transport etc.
uses REST.JSON; // Also new System.JSON
procedure TForm1.Button1Click(Sender: TObject); var Foo: TFoo; begin Foo := TFoo.Create; try Foo.Foo := 'Hello World'; Foo.Fee := 42; Memo1.Lines.Text := TJson.ObjectToJsonString(Foo); finally Foo.Free; end; Foo := TJson.JsonToObject<TFoo>(Memo1.Lines.Text); try Foo.Fee := 100; Memo1.Lines.Add(TJson.ObjectToJsonString(Foo)); finally Foo.Free; end; end;
If you want to watch this being demo’ed this very show video shows it in action http://youtu.be/TSqWoFvjj5g
How can this be done with Interfaces?
ObjectToJsonString requires object and if I put ObjectToJsonString(TMyClass(MyInterfaceVariable)) rtl complains “There not enough RTTI information”
The following works for me….make sure you have RTTI enabled in the project.
unit Unit2;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo;
type
IFoo = interface
[‘{2DB7BA3B-8BDC-49C9-8BFC-C2438D4580E0}’]
procedure SetFee(const Value: Integer);
procedure SetFoo(const Value: string);
function GetFee: Integer;
function GetFoo: string;
property Foo : string read GetFoo write SetFoo;
property Fee : Integer read GetFee write SetFee;
end;
TFoo = class(TInterfacedObject, IFoo)
private
FFee: Integer;
FFoo: string;
procedure SetFee(const Value: Integer);
procedure SetFoo(const Value: string);
function GetFee: Integer;
function GetFoo: string;
published
property Foo : string read GetFoo write SetFoo;
property Fee : Integer read GetFee write SetFee;
end;
TForm2 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Rest.JSON;
{$R *.fmx}
procedure TForm2.Button1Click(Sender: TObject);(Memo1.Lines.Text);
var
Foo: IFoo;
begin
Foo := TFoo.Create;
try
Foo.Foo := ‘Hello World’;
Foo.Fee := 42;
Memo1.Lines.Text := TJson.ObjectToJsonString(TFoo(Foo));
finally
end;
Foo := TJson.JsonToObject
try
Foo.Fee := 100;
Memo1.Lines.Add(TJson.ObjectToJsonString(TFoo(Foo)));
finally
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
end;
{ TFoo }
function TFoo.GetFee: Integer;
begin
Result := FFee;
end;
function TFoo.GetFoo: string;
begin
Result := FFoo;
end;
procedure TFoo.SetFee(const Value: Integer);
begin
FFee := Value;
end;
procedure TFoo.SetFoo(const Value: string);
begin
FFoo := Value;
end;