it编程 > 编程语言 > Delphi

delphi JSON序列化(四)

162人参与 2024-05-16 Delphi

涉及的重要类 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属性标签用。

九、简单的示例

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.

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

 

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

mORMot2 的 Logger日志

05-16

解决升级到 Delphi 12 后遇到 SQLite 不兼容的问题

05-16

Quick Library 简介

05-16

mormot2 笔记(二) Http服务的简单搭建

05-12

delphi redisclient测试

05-12

Delphi 实现刘谦春晚魔术

05-12

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论