How to skip field serialization at JSON marshalling in DataSnap?

别说谁变了你拦得住时间么 提交于 2019-12-01 02:22:57

问题


Is there a generic way to skip field serialization at JSON marshalling in Delphi XE2 DataSnap ?

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

Model = class(TBizObject);

回答1:


The solution is quite easy but very well hidden. You should set the JSONMarshalled class attribute to False for fields you don't want to serialize or deserialize.

Assume you have declared the following class you want to marshal:

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

In this declaration, only FName and FHeight will be serialized and deserialized, the FSurname will be omitted:

type
  TPerson = class
  private
    FName: string;
    [JSONMarshalled(False)]
    FSurname: string;
    FHeight: Integer;
  public
    constructor Create;
    destructor Destroy; override;
  end;

Here you have some code to play with:

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.


来源:https://stackoverflow.com/questions/10083967/how-to-skip-field-serialization-at-json-marshalling-in-datasnap

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!