unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
typinfo, jsonscanner, fpjson, fpjsonrtti;
type
TJsonComponent = class(TComponent)
protected
procedure propertyError(Sender : TObject; AObject : TObject; Info : PPropInfo;
AValue : TJSONData; Error : Exception; Var doContinue : Boolean); virtual;
procedure restoreProperty(Sender : TObject; AObject : TObject; Info : PPropInfo;
AValue : TJSONData;Var Handled : Boolean);
public
procedure LoadFromFile(const aFilename: string); virtual;
procedure SaveToFile(const aFilename: string); virtual;
procedure LoadFromStream(aStream: TStream);
procedure SaveToStream(aStream: TStream);
end;
TJSonBindDemo = class(TJsonComponent)
private
fFirstName: string;
fLastName: string;
fAge: integer;
published
property FirstName: string read fFirstName write fFirstName;
property LastName: string read fLastName write fLastName;
property Age: integer read fAge write fAge;
end;
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
const
jsondata: string = '{"FirstName": "Sophia",'+
'"LastName": "X",'+
' "Age": "25"}';
var
Form1: TForm1;
obj: TJSonBindDemo;
str: TStream;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
obj := TJSonBindDemo.Create(nil);
str := TMemoryStream.Create;
str.Write(jsondata[1], length(jsondata));
obj.LoadFromStream(str);
ShowMessage(obj.FirstName);
ShowMessage(obj.LastName);
ShowMessage(obj.Age.ToString);
str.Free;
obj.Free;
end;
procedure TJsonComponent.restoreProperty(Sender : TObject; AObject : TObject; Info : PPropInfo;
AValue : TJSONData; Var Handled : Boolean);
begin
end;
procedure TJsonComponent.propertyError(Sender : TObject; AObject : TObject; Info : PPropInfo;
AValue : TJSONData; Error : Exception; Var doContinue : Boolean);
begin
end;
procedure TJsonComponent.LoadFromStream(aStream: TStream);
var
json_str: TJSONDeStreamer;
json_dat: TJSONStringType;
t:TJSONObject;
begin
json_str := TJSONDeStreamer.Create(nil);
try
aStream.Position:=0;
json_str.OnPropertyError:= @propertyError;
json_str.OnRestoreProperty := @restoreProperty;
setLength(json_dat, aStream.Size);
aStream.Read(json_dat[1], length(json_dat));
json_str.JSONToObject(json_dat, self);
finally
json_str.Free;
end;
end;
procedure TJsonComponent.SaveToStream(aStream: TStream);
var
json_str: TJSONStreamer;
json_dat: TJSONStringType;
begin
json_str := TJSONStreamer.Create(nil);
try
json_dat := json_str.ObjectToJSONString(self);
aStream.Write(json_dat[1], length(json_dat));
finally
json_str.Free;
end;
end;
procedure TJsonComponent.LoadFromFile(const aFilename: string);
var
str: TMemoryStream;
begin
str:= TMemoryStream.Create;
try
str.LoadFromFile(aFilename);
LoadFromStream(str);
finally
str.Free;
end;
end;
procedure TJsonComponent.SaveToFile(const aFilename: string);
var
str: TMemoryStream;
begin
str:= TMemoryStream.Create;
try
SaveToStream(str);
str.SaveToFile(aFilename);
finally
str.Free;
end;
end;
end.