gpt4 book ai didi

delphi - 如何在 DataSnap 中的 JSON 编码中跳过字段序列化?

转载 作者:行者123 更新时间:2023-12-03 14:59:38 25 4
gpt4 key购买 nike

是否有一种通用方法可以在 Delphi XE2 DataSnap 中的 JSON 编码中跳过字段序列化?

TBizObjects = class
DataObject: TDataObject; -- skip this field on serializaing descendants
end;

Model = class(TBizObject);

最佳答案

解决方案非常简单,但隐藏得很好。您应该设置JSONMarshalled对于您不想序列化或反序列化的字段,将 class 属性设置为 False。

假设您已经声明了要编码(marshal)的以下类:

type
TPerson = class
private
FName: string;
FSurname: string;
FHeight: Integer;
public
constructor Create;
destructor Destroy; override;
end;

在此声明中,仅对 FNameFHeight 进行序列化和反序列化,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.

关于delphi - 如何在 DataSnap 中的 JSON 编码中跳过字段序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10083967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com