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__新加的内容"}
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论