涉及的重要类 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__新加的内容"}
发表评论