delphi JSON序列化(四)

这篇具有很好参考价值的文章主要介绍了delphi JSON序列化(四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

涉及的重要类 REST.Json,REST.JsonReflect,REST.Json.Interceptors, REST.Json.Types单元中。

一、TJson类

最简单的一个类,提供了JSON -> OBJECT和OBJECT -> JSON几个方法,方法有TJsonOptions参数,如:

    class function ObjectToJsonObject(AObject: TObject; AOptions: TJsonOptions = CDefaultOptions): TJSONObject;

type
  TJsonOption = (joIgnoreEmptyStrings, joIgnoreEmptyArrays,
    joDateIsUTC, joDateFormatUnix, joDateFormatISO8601, joDateFormatMongo, joDateFormatParse,
    joBytesFormatArray, joBytesFormatBase64,
    joIndentCaseCamel, joIndentCaseLower, joIndentCaseUpper, joIndentCasePreserve,
    joSerialFields, joSerialPublicProps, joSerialPublishedProps, joSerialAllPubProps);
  TJsonOptions = set of TJsonOption;

TJsonOptions主要是控制一些转换细节,如日期类型的格式,Base64, 驼峰,属性的可见性等。

二、TConverter<TSerial> 类

这是一个抽象类,提供了序列化过程中的相关方法

三、  TJSONConverter = class(TConverter<TJSONValue>)

是TConverter<TSerial> 类的子类,实现了父类的抽象方法,同时也是默认的转换器。

四、TJSONMarshal和TJSONUnMarshal

这个类是正、反序列化的两个具体类。TJson内部就是使用这两个类完成工作的。

五、一些TCustomAttribute的子类

这些子类是“贴标签”用的,  如JSONMarshalledAttribute和JsonNameAttribute

  TPerson = class
  private
    fname: string;
    fage: Integer;
  public
    [JsonName('_new_name_')]
    property name: string read fname write fname;
    [JSONMarshalled(false)]
    property age: Integer read fage write fage;
  end;
//json结果 : {"_new_name_":"aaa"}

六、TJSONConverters类

这个类有几个静态方法,可以添加转换事件类。

七、TConverterEvent和TReverterEvent

这两个类是成对的,主要是定义了拦截事件。

八、TJSONInterceptor类

可以自定义不同的TJSONInterceptor子类,然后供JsonReflectAttribute属性标签用。

九、简单的示例

delphi JSON序列化(四)delphi JSON序列化(四)
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Rest.JSON.Types, Rest.JsonReflect;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TTestInterceptor = class(TJSONInterceptor)
  public
    function StringConverter(Data: TObject; Field: string): string; override;  // 注意事项 2: 这个方法实现要追加的字符串。
    function TypeObjectConverter(Data: TObject): TObject; override;     //注意事项一:转换对象的这个方法一定要实现,
  end;

  [JSONSerialize(jmPublicProps)]  //
  [JsonReflect(ctTypeObject, rtTypeObject, TTestInterceptor)] //注意事项一:偷换了转换的对象,
  TPerson = class
  private
    fname: string;
    fage: Integer;
  public
    constructor Create(_name: string; _age: Integer);
    property name: string read fname write fname;
    property age: Integer read fage write fage;
  end;

  [JSONSerialize(jmPublicProps)]
  TPerson2 = class
  private
    fname: string;
    fage: Integer;
  public
    constructor Create;
    [JsonReflect(ctString, rtString, TTestInterceptor)]    //注意事项 2 :字符串属性内容转换。
    [JsonName('new_name_')]
    property name: string read fname write fname;
    [JSONMarshalled(false)]
    property age: Integer read fage write fage;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  REST.Json, System.Generics.Collections;

{ TPerson }

constructor TPerson.Create(_name: string; _age: Integer);
begin
  inherited Create;
  fname := _name;
  fage := _age;
end;

{ TPerson2 }

constructor TPerson2.Create;
begin
  inherited Create;
  fname := 'person222222';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  var p := TPerson.Create('aaa', 1);
  var jsonValue := TJson.ObjectToJsonObject(p, [joIndentCaseUpper]);  // 注意:自定义转换后,name不会转为大写。
  Memo1.Text := jsonValue.toString;
  p.Free;
end;

{ TTestInterceptor }

function TTestInterceptor.StringConverter(Data: TObject; Field: string): string;
begin
  Result := RTTIProvider.GetMember(Data, Field).GetValue(Data).AsString + '__新加的内容';
end;

function TTestInterceptor.TypeObjectConverter(Data: TObject): TObject;
begin
  //这里偷换为 person2.
  Result := TPerson2.Create;
end;

end.
View Code

结果:{"new_name_":"person222222__新加的内容"}

 文章来源地址https://www.toymoban.com/news/detail-779061.html

到了这里,关于delphi JSON序列化(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS处理json,序列化和反序列化

    Mantle 是一个开源的 Objective-C 框架,用于在 iOS 和 macOS 应用程序中实现模型层的序列化和反序列化。它提供了一种简单而强大的方式来将 JSON数据格式转换为自定义的数据模型对象,以及将数据模型对象转换为字典或 JSON 格式。 Mantle具有如下特点 自动映射 Mantle自动将 JSON 数据

    2024年02月11日
    浏览(59)
  • c#示例-json序列化和json树

    由于指针和引用类型的存在,在运行中的程序中,数据不一定是整块的。 可能东一块西一块散落在内存的各个地方。 序列,是指连续且有序的一个整体。序列化就是把数据变为连续有序整体的过程。 经过这样处理后的数据就可以方便的进行传输和储存了。 json是一种文本数

    2024年02月16日
    浏览(79)
  • rust学习-json的序列化和反序列化

    由于 serde 库默认使用 JSON 格式进行序列化和反序列化 因此程序将使用 JSON 格式对数据进行序列化和反序列化 JSON:广泛使用的 JavaScript 对象符号,用于许多 HTTP API Postcard:no_std 和嵌入式系统友好的紧凑二进制格式。 CBOR:用于小消息大小且无需版本协商的简洁二进制对象表示

    2024年02月12日
    浏览(38)
  • 使用nlohmann json库进行序列化与反序列化

    nlohmann源码仓库:https://github.com/nlohmann/json 使用方式:将其nlohmann文件夹加入,包含其头文件json.hpp即可 demo

    2024年02月10日
    浏览(36)
  • 【网络】协议的定制与Json序列化和反序列化

    我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层 建立链接和断开链接 基于TCP协议,我们需要知道写代码时对应的接口大概在TCP通讯的过程中属于什么样的时间点角色,在TCP协议时详谈。三次握手,四次挥手 listen状态:准备好了,可以进

    2024年02月09日
    浏览(38)
  • 【网络编程】协议定制+Json序列化与反序列化

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、序列化与反序列化的概念 二、自定义协议设计一个网络计算器 2.1TCP协议,如何保证接收方收到了完整的报文呢?

    2024年02月06日
    浏览(54)
  • JSON序列化与反序列化NULL值丢失问题

    做项目一般都会有一些特殊的需求,例如保留json中的null值,但是fastjson都会把null值得属性给过滤掉 json序列化保留null值 json反序列化保留null值 使用hutool的Json工具时

    2024年02月15日
    浏览(59)
  • Untiy Json和Xml的序列化和反序列化

    Ps: Unity C# Json 序列化换行 效果: 引用:

    2024年02月13日
    浏览(44)
  • ASP.NET中JSON的序列化和反序列化

      JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式。在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间、集合、字典的处理。

    2024年02月15日
    浏览(33)
  • 【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )

    当谈到网络编程时,序列化和反序列化是非常重要的概念。在上一篇文章中,我们已经了解了在Linux环境下实现简单的TCP网络程序的基础知识。本文将继续探讨序列化和反序列化,这些概念对于在网络上传输数据以及跨网络通信至关重要。通过深入了解序列化和反序列化,我

    2024年04月08日
    浏览(85)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包