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

2023-11-27

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

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

Model = class(TBizObject);

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

假设您已经声明了要封送的以下类:

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

在本声明中,仅FName and FHeight将被序列化和反序列化,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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 DataSnap 中的 JSON 编组中跳过字段序列化? 的相关文章

随机推荐

  • 控制台应用程序 - 当前工作线上方的 WriteLine

    我看过其他一些与此非常相似的帖子 但他们给出的答案并没有正确回答问题 抱歉 如果有什么隐藏的东西我找不到 我想使用 Console WriteLine 打印当前 Console ReadLine 上方的内容 例如 我的应用程序打印 Hell
  • 将变量编号分配给复数数组

    我想将复杂数组分配为变量 我的代码就像 complex indx 3 3 integer i j do i 1 3 do j 1 3 indx i j i j write indx i j end do end do 在这种情况下我收到类似
  • 在后面的代码中设置显示属性

    如何将显示属性设置为在后面的代码中阻止
  • 升级到 Gradle 7 后 Android Gradle Javadoc 损坏

    几天前 我升级到了新的 Android Studio Arctic Fox 版本 现在也需要 Gradle 7 在升级之前 我有以下 javadoc 任务 它运行得很好 def javaDocsAllowList com mycompany
  • 根据外部值有条件地应用管道步骤

    鉴于 dplyr 工作流程 require dplyr mtcars gt tibble rownames to column var model gt filter grepl x model pattern Merc gt group
  • “谓词下推”和“投影下推”有什么区别?

    我找到了多种信息来源 例如发现的一个here 将 谓词下推 解释为 如果您可以将部分查询 下推 到数据存储的位置 从而过滤掉大部分数据 那么您可以大大减少网络流量 但是 我还在其他文档中看到了术语 投影下推 例如here 这似乎是同一件事
  • Android每5秒拍照一次

    使用相机 API 我能够成功拍摄照片并将其保存到文件夹中 这是我正在使用的代码 主要 xml
  • Amazon APi 网关无法生成转换后的请求

    我正在尝试将 Amazon API gateway 与 Lambda 函数集成 我成功地实现了这一目标 但是当我尝试使用curl 时 它失败了 设置 Lambda 方法 API 网关集成以及集成请求下的模板映射 当我从控制台运行 测试 时
  • 将鼠标悬停在子级上时如何禁用父级悬停

    我将尝试用一些简单的例子来展示我的问题 我拥有的 http jsfiddle net JGzSh 3 这是一些简单的按钮 稍后会有 onclick 事件 当我将鼠标悬停在绿色 div 父级 上时 hover可以稍微改变它的颜色 有什么问题
  • 如何重命名 tSQLt 测试类?

    我正在使用以下方法开发数据库红门 SQL 开发人员 tools SQL Test运行 tSQLt 测试的 SSMS 加载项缺少重命名测试类的方法 我有一个测试叫 BackendLayerCustomerAdministrationTests
  • 未捕获 无法从 URL 哈希获取父源

    我正在尝试为我的网络应用程序设置谷歌登录 目前 它处于开发状态并运行在http localhost 8080 auth 我使用 Google 提供的默认登录按钮进行用户登录 每当打开新的 iFrame 进行用户身份验证时 它就会无限挂起 当
  • TypeScript 扩展 String Static

    有没有办法将 isNullOrEmpty str string 添加到静态字符串对象 这样我就可以称之为 String isNullOrEmpty myobj 我找到了一种将其放在实现中的方法 但这对这样的方法没有帮助 String定义于l
  • Javascript:抑制 onbeforeunload 上的“此页面要求您确认是否要离开”弹出窗口

    当用户离开页面时 我需要在离开之前询问他是否想执行特定操作
  • Jquery - 遍历所有 xml 标签

    如何循环遍历xml中的所有标签 我有一个 php 可以生成类似于下一个的 xml
  • 动态指定选项和参数

    我想从数据库加载参数和选项 我允许用户定义自己的选项和参数 用户可以通过命令行调用远程api 它们指定端点的 URL 和参数 这是数据库中的数据的样子 name thename1 short a long ace type string r
  • iOS - UIImageView - 如何处理 UIImage 图像方向

    是否可以设置UIImageView处理图像方向 当我设置UIImageView具有方向的图像RIGHT 这是来自相机胶卷的照片 图像向右旋转 但我想以正确的方向显示它 因为它是拍摄的 我知道我可以旋转图像数据 但可以做得更优雅吗 如果我理解
  • 如何在VIM中指定Python解释器版本?

    为了使用插件 Clang complete 在 Vim 中编写 C 安装后出现此错误 Error detected while processing function
  • NLog:记录序列化为 JSON 的对象

    我有一个带有 NLog 配置的 Net 项目 它允许我生成 JSON 格式的日志文件 它可以很好地处理简单的短信 现在 我需要记录一些已序列化为 JSON 的任意对象 当我将这些 JSON 字符串记录为日志消息时 NLog 将文本放在引号中
  • 如何在不丢失现有数据的情况下重新启动 Fabric Composer?

    我在本地尝试过 carauction network 示例 但是 当我使用 startFabric sh 文件启动网络时 它会删除 Couch DB 并再次创建 Couch DB 因为旧数据正在丢失 请建议我们如何在不清理数据的情况下启动结
  • 如何在 DataSnap 中的 JSON 编组中跳过字段序列化?

    是否有一种通用方法可以在 Delphi XE2 DataSnap 中的 JSON 编组中跳过字段序列化 TBizObjects class DataObject TDataObject skip this field on serializ