JSONとDelphi Objectの交換

12280 ワード

DelphiはRTTIが強化されてから、言語の柔軟性がどれだけ強化されたか、DelphiのdbExpressにはDBXJSONとDBXJSOnReflectの2つのユニットが提供され、JSONシーケンス化が提供されている
 
次の例はDelphiエンティティオブジェクトをJSON文字列に変換し、JSON文字列をDelphiエンティティオブジェクトに変換する例です.(Delphi XE 3でテストに合格しました)
 
 1 unit Unit2;

 2 

 3 interface

 4 

 5   uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,

 6     DBXJSON, DBXJSONReflect;

 7 

 8   type

 9     TPerson = class(TObject)

10     public

11       Name: String;

12       Password: String;

13       Age: Integer;

14     end;

15 

16     TForm2 = class(TForm)

17       Memo1: TMemo;

18       procedure FormCreate(Sender: TObject);

19     private

20       function ObjectToJSON(AData: TObject): TJSONValue;

21       function JSONToObject(AJSONValue: TJSONValue): TObject; 

22     public                                                    

23     end;

24 

25   var

26     Form2: TForm2;

27 

28 implementation

29 

30   {$R *.dfm}

31 

32   function TForm2.JSONToObject(AJSONValue: TJSONValue): TObject;

33   var

34     lUnMarshal: TJSONUnMarshal;

35   begin

36     lUnMarshal := TJSONUnMarshal.Create();

37     try

38       Result := lUnMarshal.Unmarshal(AJSONValue);

39     finally

40       FreeAndNil(lUnMarshal);

41     end;

42   end;

43 

44   function TForm2.ObjectToJSON(AData: TObject): TJSONValue;

45   var

46     lMarshal: TJSONMarshal;

47   begin

48     lMarshal := TJSONMarshal.Create();

49     try

50       Result := lMarshal.Marshal(AData);

51     finally

52       FreeAndNil(lMarshal);

53     end;

54   end;

55 

56   procedure TForm2.FormCreate(Sender: TObject);

57   var

58     lPerson: TPerson;

59     lJSONValue: TJSONValue;

60   const

61     lJSONString: String = '{"type":"Unit2.TPerson","id":1,"fields":{"Name":"Hezihang","Password":"123","Age":23}}';

62   begin

63     Memo1.Lines.Clear;

64     /// Object Convert to JSON

65     Memo1.Lines.Add('Object to JSON String');

66     Memo1.Lines.Add('--------------------------------------');

67     Memo1.Lines.Add('');

68     lPerson       := TPerson.Create;

69     lPerson.Name    := 'Hezihang';

70     lPerson.Password := '123';

71     lPerson.Age   := 23;

72     lJSONValue       := ObjectToJSON(lPerson);

73     FreeAndNil(lPerson);

74     Memo1.Lines.Add(lJSONValue.ToString);

75     lJSONValue.Free;

76     Memo1.Lines.Add('');

77     Memo1.Lines.Add('--------------------------------------');

78     /// JSON Convert to Object

79     Memo1.Lines.Add('');

80     Memo1.Lines.Add('JSON String'' To a Class Instance''');

81     Memo1.Lines.Add('--------------------------------------');

82     Memo1.Lines.Add('');

83     lJSONValue := TJSONObject.ParseJSONValue(lJSONString);

84     lPerson := JSONToObject(lJSONValue) as TPerson;

85     lJSONValue.Free;

86     Memo1.Lines.Add('Name: ' + lPerson.Name);

87     Memo1.Lines.Add('Password: ' + lPerson.Password);

88     Memo1.Lines.Add('Age: ' + IntToStr(lPerson.Age));

89     lPerson.Free;

90     Memo1.Lines.Add('');

91     Memo1.Lines.Add('--------------------------------------');

92   end;

93 

94 end.