在 Delphi XE2 DataSnap 的 JSON 编组中是否有一种通用的方法来跳过字段序列化?
TBizObjects = class
DataObject: TDataObject; -- skip this field on serializaing descendants
end;
Model = class(TBizObject);
在 Delphi XE2 DataSnap 的 JSON 编组中是否有一种通用的方法来跳过字段序列化?
TBizObjects = class
DataObject: TDataObject; -- skip this field on serializaing descendants
end;
Model = class(TBizObject);
解决方案非常简单,但隐藏得非常好。JSONMarshalled
对于不想序列化或反序列化的字段,您应该将class 属性设置为 False。
假设您已声明要编组的以下类:
type
TPerson = class
private
FName: string;
FSurname: string;
FHeight: Integer;
public
constructor Create;
destructor Destroy; override;
end;
在这个声明中,只有FName
andFHeight
会被序列化和反序列化,FSurname
会被省略:
type
TPerson = class
private
FName: string;
[JSONMarshalled(False)]
FSurname: string;
FHeight: Integer;
public
constructor Create;
destructor Destroy; override;
end;
在这里,您可以使用一些代码:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Data.DBXJSON, Data.DBXJSONReflect;
type
TPerson = class
private
FName: string;
// try to comment and uncomment the following line and see the result
[JSONMarshalled(False)]
FSurname: string;
FHeight: Integer;
end;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Person: TPerson;
JSONString: string;
JSONMarshal: TJSONMarshal;
JSONUnMarshal: TJSONUnMarshal;
begin
JSONMarshal := TJSONMarshal.Create(TJSONConverter.Create);
try
Person := TPerson.Create;
try
Person.FName := 'Petra';
Person.FSurname := 'Kvitova';
Person.FHeight := 183;
JSONString := JSONMarshal.Marshal(Person).ToString;
Memo1.Text := JSONString;
finally
FreeAndNil(Person);
end;
finally
JSONMarshal.Free;
end;
JSONUnMarshal := TJSONUnMarshal.Create;
try
Person := JSONUnMarshal.Unmarshal(TJSONObject.ParseJSONValue(JSONString)) as TPerson;
try
ShowMessage(
'Name: ' + Person.FName + sLineBreak +
'Surname: ' + Person.FSurname + sLineBreak +
'Height: ' + IntToStr(Person.FHeight) + ' cm'
);
finally
Person.Free;
end;
finally
JSONUnMarshal.Free;
end;
end;
end.