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

标签 delphi delphi-xe2 datasnap

是否有一种通用方法可以在 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/

相关文章:

delphi - 加载 midas.dll 时发生 Midas.dll 错误

德尔福DataSnap套接字服务器 "Failed to create key 211"

email - 如何使用 Delphi 和 Synapse 一次向多个收件人发送电子邮件?

delphi - 在Delphi中填充TStringGrid

delphi - VCL-Styles菜单热键不一致

delphi - DataSnap 和数据库连接/登录

delphi - Delphi 7支持inline关键字吗?

database - 如何在不应用挂起的更新的情况下刷新 TClientDataSet?

c++ - 如何将目录与我的应用程序相关联

delphi - 将 Delphi XE2 ADO 组件与 SQLOLEDB.1 提供程序一起使用是否存在已知问题?