delphi JSON序列化(四)

打印 上一主题 下一主题

主题 890|帖子 890|积分 2670

涉及的重要类 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;
  1. type
  2.   TJsonOption = (joIgnoreEmptyStrings, joIgnoreEmptyArrays,
  3.     joDateIsUTC, joDateFormatUnix, joDateFormatISO8601, joDateFormatMongo, joDateFormatParse,
  4.     joBytesFormatArray, joBytesFormatBase64,
  5.     joIndentCaseCamel, joIndentCaseLower, joIndentCaseUpper, joIndentCasePreserve,
  6.     joSerialFields, joSerialPublicProps, joSerialPublishedProps, joSerialAllPubProps);
  7.   TJsonOptions = set of TJsonOption;
复制代码
TJsonOptions主要是控制一些转换细节,如日期类型的格式,Base64, 驼峰,属性的可见性等。
二、TConverter 类
这是一个抽象类,提供了序列化过程中的相关方法
三、  TJSONConverter = class(TConverter)
是TConverter 类的子类,实现了父类的抽象方法,同时也是默认的转换器。
四、TJSONMarshal和TJSONUnMarshal
这个类是正、反序列化的两个具体类。TJson内部就是使用这两个类完成工作的。
五、一些TCustomAttribute的子类
这些子类是“贴标签”用的,  如JSONMarshalledAttribute和JsonNameAttribute
  1.   TPerson = class
  2.   private
  3.     fname: string;
  4.     fage: Integer;
  5.   public
  6.     [JsonName('_new_name_')]
  7.     property name: string read fname write fname;
  8.     [JSONMarshalled(false)]
  9.     property age: Integer read fage write fage;
  10.   end;<br>//json结果 :  {"_new_name_":"aaa"}
复制代码
六、TJSONConverters类
这个类有几个静态方法,可以添加转换事件类。
七、TConverterEvent和TReverterEvent
这两个类是成对的,主要是定义了拦截事件。
八、TJSONInterceptor类
可以自定义不同的TJSONInterceptor子类,然后供JsonReflectAttribute属性标签用。
九、简单的示例
  1. unit Unit1;
  2. interface
  3. uses
  4.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  5.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Rest.JSON.Types, Rest.JsonReflect;
  6. type
  7.   TForm1 = class(TForm)
  8.     Memo1: TMemo;
  9.     procedure FormCreate(Sender: TObject);
  10.   private
  11.     { Private declarations }
  12.   public
  13.     { Public declarations }
  14.   end;
  15.   TTestInterceptor = class(TJSONInterceptor)
  16.   public
  17.     function StringConverter(Data: TObject; Field: string): string; override;  // 注意事项 2: 这个方法实现要追加的字符串。
  18.     function TypeObjectConverter(Data: TObject): TObject; override;     //注意事项一:转换对象的这个方法一定要实现,
  19.   end;
  20.   [JSONSerialize(jmPublicProps)]  //
  21.   [JsonReflect(ctTypeObject, rtTypeObject, TTestInterceptor)] //注意事项一:偷换了转换的对象,
  22.   TPerson = class
  23.   private
  24.     fname: string;
  25.     fage: Integer;
  26.   public
  27.     constructor Create(_name: string; _age: Integer);
  28.     property name: string read fname write fname;
  29.     property age: Integer read fage write fage;
  30.   end;
  31.   [JSONSerialize(jmPublicProps)]
  32.   TPerson2 = class
  33.   private
  34.     fname: string;
  35.     fage: Integer;
  36.   public
  37.     constructor Create;
  38.     [JsonReflect(ctString, rtString, TTestInterceptor)]    //注意事项 2 :字符串属性内容转换。
  39.     [JsonName('new_name_')]
  40.     property name: string read fname write fname;
  41.     [JSONMarshalled(false)]
  42.     property age: Integer read fage write fage;
  43.   end;
  44. var
  45.   Form1: TForm1;
  46. implementation
  47. {$R *.dfm}
  48. uses
  49.   REST.Json, System.Generics.Collections;
  50. { TPerson }
  51. constructor TPerson.Create(_name: string; _age: Integer);
  52. begin
  53.   inherited Create;
  54.   fname := _name;
  55.   fage := _age;
  56. end;
  57. { TPerson2 }
  58. constructor TPerson2.Create;
  59. begin
  60.   inherited Create;
  61.   fname := 'person222222';
  62. end;
  63. procedure TForm1.FormCreate(Sender: TObject);
  64. begin
  65.   var p := TPerson.Create('aaa', 1);
  66.   var jsonValue := TJson.ObjectToJsonObject(p, [joIndentCaseUpper]);  // 注意:自定义转换后,name不会转为大写。
  67.   Memo1.Text := jsonValue.toString;
  68.   p.Free;
  69. end;
  70. { TTestInterceptor }
  71. function TTestInterceptor.StringConverter(Data: TObject; Field: string): string;
  72. begin
  73.   Result := RTTIProvider.GetMember(Data, Field).GetValue(Data).AsString + '__新加的内容';
  74. end;
  75. function TTestInterceptor.TypeObjectConverter(Data: TObject): TObject;
  76. begin
  77.   //这里偷换为 person2.
  78.   Result := TPerson2.Create;
  79. end;
  80. end.
复制代码
View Code结果:{"new_name_":"person222222__新加的内容"}
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表