不到断气不罢休 发表于 2024-3-28 23:44:09

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]
查看完整版本: delphi JSON序列化(四)