6

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

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

Model = class(TBizObject);
4

1 回答 1

8

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

假设您已声明要编组的以下类:

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

在这个声明中,只有FNameandFHeight会被序列化和反序列化,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.
于 2012-04-11T11:57:26.990 回答