涉及的重要类 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
- [JsonName('_new_name_')]
- property name: string read fname write fname;
- [JSONMarshalled(false)]
- property age: Integer read fage write fage;
- end;<br>//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.
复制代码 View Code结果:{"new_name_":"person222222__新加的内容"}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |