如何在DataSnap中的JSON编组中跳过字段序列化? [英] How to skip field serialization at JSON marshalling in DataSnap?

查看:124
本文介绍了如何在DataSnap中的JSON编组中跳过字段序列化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  TBizObjects = class $ b $是否有通用的方法在Delphi XE2 DataSnap中的JSON编组中跳过字段序列化? b DataObject:TDataObject; - 在串行化后代跳过此字段
end;

Model = class(TBizObject);


解决方案

解决方案很容易,但非常好隐藏。您应该设置 JSONMarshalled class属性为False表示您不想序列化或反序列化的字段。



假设您已经声明了要组织的以下类:

 键入
TPerson = class
private
FName:string;
FSurname:string;
FHeight:整数;
public
构造函数创建;
析构函数覆盖
结束

在此声明中,只有 FName code> FHeight 将被序列化和反序列化, FSurname 将被省略:



类型
TPerson = class
private
FName:string;
[JSONMarshalled(False)]
FSurname:string;
FHeight:整数;
public
构造函数创建;
析构函数覆盖
结束

这里有一些代码可以玩:



单位Unit1;

  

接口

使用
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;
//尝试评论并取消注释以下行,并查看结果
[JSONMarshalled(False)]
FSurname:string;
FHeight:整数;
结束

type
TForm1 = class(TForm)
Memo1:TMemo;
Button1:TButton;
procedure Button1Click(Sender:TObject);
private
{私人声明}
public
{公开声明}
end;

var
Form1:TForm1;

实现

{$ R * .dfm}

程序TForm1.Button1Click(发件人:TObject);
var
个人:TPerson;
JSONString:string;
JSONMarshal:TJSONMarshal;
JSONUnMarshal:TJSONUnMarshal;
begin
JSONMarshal:= TJSONMarshal.Create(TJSONConverter.Create);
try
个人:= TPerson.Create;
try
Person.FName:='Petra';
Person.FSurname:='Kvitova';
Person.FHeight:= 183;

JSONString:= JSONMarshal.Marshal(Person).ToString;
Memo1.Text:= JSONString;
finally
FreeAndNil(Person);
结束
finally
JSONMarshal.Free;
结束

JSONUnMarshal:= TJSONUnMarshal.Create;
尝试
Person:= JSONUnMarshal.Unmarshal(TJSONObject.ParseJSONValue(JSONString))作为TPerson;
try
ShowMessage(
'Name:'+ Person.FName + sLineBreak +
'姓氏:'+ Person.FSurname + sLineBreak +
'Height:'+ IntToStr(Person.FHeight)+'cm'
);
finally
Person.Free;
结束
finally
JSONUnMarshal.Free;
结束
结束

结束。


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);

解决方案

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.

这篇关于如何在DataSnap中的JSON编组中跳过字段序列化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆