-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJsonLog.pas
136 lines (118 loc) · 3.17 KB
/
JsonLog.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
unit JsonLog;
interface
{*
DataSetToJSONString
Prepared for instant export of records in TDataset as JSON
USAGE
var
str:String;
str:=TJSONLog.DataSetToJSONString(Adoquery1);
JSONStringToDataSet
It can be used to transfer dataset of previously retrieved JSonString data
*}
uses
System.SysUtils, System.JSON, System.Classes, Data.DB, FireDAC.Comp.Client, Variants;
type
TJSONLog = class
class function DataSetToJSONString(DataSet: TDataSet): string; static;
class function JSONStringToDataSet(const JsonString: string; DataSet: TDataSet): Boolean; static;
public
destructor Destroy; override;
end;
implementation
{ TJSONHelper }
function GetVariantTypeAsFieldType(const V: Variant): TFieldType;
begin
case VarType(V) of
varSmallint, varInteger, varByte, varWord, varLongWord:
Result := ftInteger;
varSingle, varDouble, varCurrency:
Result := ftFloat;
varDate:
Result := ftDateTime;
varBoolean:
Result := ftBoolean;
varString, varUString, varOleStr:
Result := ftString;
varNull:
Result := ftUnknown;
else
Result := ftUnknown;
end;
end;
class function TJSONLog.DataSetToJSONString(DataSet: TDataSet): string;
var
Field: TField;
Row: TJSONObject;
Rows: TJSONArray;
begin
Rows := TJSONArray.Create;
try
try
Row := TJSONObject.Create;
try
for Field in DataSet.Fields do
begin
if not Field.IsNull then
Row.AddPair(Field.FieldName, Field.AsVariant);
end;
Rows.AddElement(Row);
except
Row.Free;
raise;
end;
Result := Rows.ToString;
except
Rows.Free;
raise;
end;
finally
Rows.Free;
end;
end;
destructor TJSONLog.Destroy;
begin
Self.DisposeOf;
inherited;
end;
class function TJSONLog.JSONStringToDataSet(const JSONString: string; DataSet: TDataSet): Boolean;
var
JSONArray: TJSONArray;
Row: TJSONObject;
FieldName, FieldValue: string;
FDJSONValue: TJSONValue;
i: Integer;
begin
Result := True;
Row := nil;
FDJSONValue := TJSONObject.ParseJSONValue(JSONString);
JSONArray := TJSONArray(TJSONObject.ParseJSONValue(FDJSONValue.ToJSON));
try
DataSet.DisableControls;
if not (DataSet.Active) then
DataSet.Open
else
while DataSet.RecordCount > 0 do
DataSet.Delete;
if JSONArray.Count > 0 then
begin
Row := JSONArray.Items[0] as TJSONObject;
for i := 0 to Row.Count - 1 do
begin
FieldName := Row.Pairs[i].JSONString.Value;
FieldValue := Row.Pairs[i].JSONValue.Value;
DataSet.Append;
DataSet.FieldByName('ID').AsInteger := i + 1;
DataSet.FieldByName('FIELDVALUE').AsString := FieldValue;
DataSet.Post;
end;
end;
finally
DataSet.First;
DataSet.EnableControls;
FDJSONValue.Free;
JSONArray.Free;
Row.Free;
end;
end;
end.