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 类
这是一个抽象类,提供了序列化过程中的相关方法
三、 TJSONConverter = class(TConverter)
是TConverter 类的子类,实现了父类的抽象方法,同时也是默认的转换器。
四、TJSONMarshal和TJSONUnMarshal
这个类是正、反序列化的两个具体类。TJson内部就是使用这两个类完成工作的。
五、一些TCustomAttribute的子类
这些子类是“贴标签”用的, 如JSONMarshalledAttribute和JsonNameAttribute
TPerson = class
private
fname: string;
fage: Integer;
public
property name: string read fname write fname;
property age: Integer read fage write fage;
end;<br>//json结果 :{"_new_name_":"aaa"}六、TJSONConverters类
这个类有几个静态方法,可以添加转换事件类。
七、TConverterEvent和TReverterEvent
这两个类是成对的,主要是定义了拦截事件。
八、TJSONInterceptor类
可以自定义不同的TJSONInterceptor子类,然后供JsonReflectAttribute属性标签用。
九、简单的示例
https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttps://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifunit 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;
//
//注意事项一:偷换了转换的对象,
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;
TPerson2 = class
private
fname: string;
fage: Integer;
public
constructor Create;
//注意事项 2 :字符串属性内容转换。
property name: string read fname write fname;
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, );// 注意:自定义转换后,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__新加的内容"}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]