-
Notifications
You must be signed in to change notification settings - Fork 34
/
uSerializerJSON.pas
117 lines (112 loc) · 3.72 KB
/
uSerializerJSON.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
unit uSerializerJSON;
interface
uses
System.SysUtils, System.Classes, System.Rtti, Data.DBXJSON, Data.DBXJSONReflect,
FMX.TreeView, SvCollections.Tries, System.JSON, System.IOUtils,
uUnit, uSerializer;
type
TSerializerJSON = class(TSerializer)
private
class var
FMarchal: TJSONMarshal;
FUnMarshal: TJSONUnMarshal;
public
const
SJSON : string = 'json';
public
constructor Create;
destructor Destroy; override;
class function Marshal(const Value : TUnit) : string; override;
class function MarshalToFile(const Value : TUnit; const AFileName : string) : string; override;
class function UnMarshalFromFile(const AFileName : string) : TUnit; override;
class function UnMarshal(const Value : string) : TUnit; override;
class function SEARCH_PATTERN : string; override;
end;
implementation
{ TSerializer }
{------------------------------------------------------------------------------}
constructor TSerializerJSON.Create;
begin
inherited;
end;
{------------------------------------------------------------------------------}
destructor TSerializerJSON.Destroy;
begin
inherited;
end;
{------------------------------------------------------------------------------}
class function TSerializerJSON.SEARCH_PATTERN: string;
begin
Result := '*.' + SJSON;
end;
{------------------------------------------------------------------------------}
class function TSerializerJSON.Marshal(const Value: TUnit): string;
begin
if not Assigned(Value) then
Exit('');
FMarchal:= TJSONMarshal.Create(TJSONConverter.Create);
Result := FMarchal.Marshal(Value).ToString;
FreeAndNil(FMarchal);
end;
{------------------------------------------------------------------------------}
class function TSerializerJSON.MarshalToFile(const Value : TUnit;
const AFileName : string): string;
var
LValue : string;
begin
LValue := TSerializerJSON.Marshal(Value);
TSerializerUtils.SaveString(LValue, AFileName + '.' + SJSON);
Result := LValue;
end;
{------------------------------------------------------------------------------}
class function TSerializerJSON.UnMarshal(const Value: string): TUnit;
begin
FUnMarshal := TJSONUnMarshal.Create;
FUnMarshal.RegisterReverter(TUnit, 'FSections',
procedure(Data: TObject; Field: String; Args: TListOfObjects)
var
obj: TObject;
LUnit : TUnit;
LSection : TUnit.TUnitSection;
begin
LUnit := TUnit(Data);
for obj in Args do
begin
LSection := TUnit.TUnitSection(obj);
LSection.Parent := LUnit;
LUnit.Sections.Add(LSection);
end
end);
FUnMarshal.RegisterReverter(TUnit.TUnitSection, 'FClasses',
procedure(Data: TObject; Field: String; Args: TListOfObjects)
var
obj: TObject;
LUnit : TUnit;
LSection : TUnit.TUnitSection;
begin
LSection := TUnit.TUnitSection(Data);
for obj in Args do
begin
LUnit := TUnit(obj);
LUnit.ParentSection := LSection;
LSection.AddUnit(LUnit);
end
end);
Result := FUnMarshal.Unmarshal(TJSONObject.ParseJSONValue(Value)) as TUnit;
FreeAndNil(FUnMarshal);
end;
{------------------------------------------------------------------------------}
class function TSerializerJSON.UnMarshalFromFile(const AFileName: string): TUnit;
var
LValue : string;
LUnit : TUnit;
begin
LUnit := nil;
if TSerializerUtils.LoadString(AFileName, LValue) then
begin
LUnit := TSerializerJSON.UnMarshal(LValue);
end;
Result := LUnit;
end;
{------------------------------------------------------------------------------}
end.