How to skip field serialization at JSON marshalling in DataSnap?

前端 未结 1 1067
臣服心动
臣服心动 2021-01-12 23:03

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

TBizObjects = class
  DataObject: TDataObject; -- skip this f         


        
相关标签:
1条回答
  • 2021-01-12 23:45

    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.
    
    0 讨论(0)
提交回复
热议问题