1 unitDSCJSON;2
3 (*
4 作者: 刘志林5 最后修改日期: 2016-08-176 版本: 1.37
8 修改历史:9 1.310 去掉字符编码配置, 去掉二进制编码配置11 增加对二进制字段压缩的支持(使用7-ZIP)12 优化了一些代码结构13 1.214 支持QJSON15 增加SYSTEM.JSON单元支持(D10中新单元, 就是原有的DBXJSON)16 1.117 支持FireDAC18 增加DBXJSON单元支持19 增加对NULL值字段支持20 1.0:21 支持ADO/ClientDataset与JSON互相转换22 使用SuperObject单元作为JSON解析单元23
24 联系方式: lzl_17948876@hotmail.com25
26 !!! 若有修改,请通知作者,谢谢合作 !!!27 *)
28
29 {$DEFINE FIREDAC}
30 //{$DEFINE ADO}
31
32 {$DEFINE QJSON}
33 //{$DEFINE JSON_SO}
34 //{$DEFINE JSON_DBX}
35 //{$DEFINE JSON_SYS}
36 {$IF DEFINED(JSON_DBX) OR DEFINED(JSON_SYS)}
37 {$DEFINE SYSJSON}
38 {$ENDIF}
39
40 //{$DEFINE 7ZIP}
41
42 interface
43
44 uses
45 SysUtils, Classes, DB, DBClient, DateUtils46 {$IFDEF JSON_DBX}
47 , DBXJSON48 {$ENDIF}
49 {$IFDEF JSON_SO}
50 , superobject, Variants51 {$ENDIF}
52 {$IFDEF FIREDAC}
53 , FireDAC.Comp.DataSet54 {$ENDIF}
55 {$IFDEF JSON_SYS}
56 , System.JSON57 {$ENDIF}
58 {$IFDEF QJSON}
59 , QJSON60 {$ENDIF}
61 {$IFDEF ADO}
62 , ADODB63 {$ENDIF}
64 , EncdDecd;65
66 /// 将数据集转化为JSON数据
67 /// TDataSet - 数据集
68 /// WideString - 输出转换结果
69 /// 转换结果 成功: True 失败: False
70 function DataSetToJSON(ADataSet: TDataSet; varAJSON: WideString): Boolean;71
72 /// JSON数据转换为结果集
73 /// JSON数据
74 /// 数据集
75 /// 转换结果 成功: True 失败: False
76 functionJSONToDataSet(AJSON: WideString; ADataSet: TDataSet): Boolean;77
78 implementation
79
80 {$IFDEF 7ZIP}
81 uses
82 SevenZIP;83 {$ENDIF}
84
85 (*
86 C: 配置表87 C.BC BolbComp 二进制字段是否压缩88 0:未压缩 1:已压缩89 默认 090 C.CC CompClass 压缩类型 {使用7-ZIP压缩, 如果不打开7ZIP编译开关, 此控制无效认为不压缩}
91 空表示不压缩, 否则为7-ZIP压缩类型92 默认 CLSID_CFormatGZip : TGUID = '{23170F69-40C1-278A-1000-000110EF0000}'
93
94 T: 表结构表95 T.N:列名96 T.D:显示列名97 T.T:列数据类型 Data.DB.TFieldType98 T.L:列数据长度99 T.R:列值是否允许为空100
101 R: 数据表102
103 {
104 "C":{"BC":0, "CM":"", "BE":0},105 "T":[{"N":"FieldName", "D":"DisplayName", "T":0, "L":100, "R":1}],106 "R":[["Field1Value", "Field2Value"]]107 }108
109 *)110
111 const
112 _FT_STRING = $00; {字符}
113 _FT_INTEGER = $01; {整形}
114 _FT_FLOAT = $02; {浮点}
115 _FT_DATETIME = $03; {日期}
116 _FT_BOOLEAN = $04; {布尔}
117 _FT_BLOB = $05; {二进制}
118
119 _FT_CURRENCY = $10; {金额}
120
121 type
122 TConfig = record
123 BolbComp: Boolean; {二进制字段是否压缩}
124 CompClass: string; {压缩模式 空表示不压缩, 否则为7-ZIP压缩类型}
125 end;126
127 functionJSONToDataSet(AJSON: WideString; ADataSet: TDataSet): Boolean;128 var
129 nJDS: {$IFDEF SYSJSON}TJSONObject{$ENDIF}
130 {$IFDEF JSON_SO}ISuperObject{$ENDIF}
131 {$IFDEF QJSON}TQJson{$ENDIF}
132 ;133 nConfig: TConfig;134
135 procedure_JTDConfig;136 var
137 nJO: {$IFDEF SYSJSON}TJSONObject{$ENDIF}
138 {$IFDEF JSON_SO}ISuperObject{$ENDIF}
139 {$IFDEF QJSON}TQJson{$ENDIF}
140 ;141 begin
142 with nConfig do
143 begin
144 BolbComp :=False;145 CompClass := '';146 end;147
148 {$IFDEF SYSJSON}
149 nJO := nJDS.GetValue('C') asTJSONObject;150 if nJO = nil then
151 Exit;152 {$ENDIF}
153 {$IFDEF JSON_SO}
154 nJO := nJDS.N['C'];155 if nJO.DataType = stNull then
156 Exit;157 {$ENDIF}
158 {$IFDEF QJSON}
159 nJO := nJDS.ItemByName('C');160 if nJO.DataType = jdtNull then
161 Exit;162 {$ENDIF}
163 with nConfig do
164 begin
165 BolbComp := {$IFDEF SYSJSON}TJSONNumber(nJO.GetValue('BC')).AsInt{$ENDIF}
166 {$IFDEF JSON_SO}nJO.I['BC']{$ENDIF}
167 {$IFDEF QJSON}nJO.ItemByName('BC').AsInteger{$ENDIF}
168 = 1;169 {$IFDEF 7ZIP}
170 CompClass := {$IFDEF SYSJSON}nJO.GetValue('CC').Value{$ENDIF}
171 {$IFDEF JSON_SO}nJO['CC'].AsString{$ENDIF}
172 {$IFDEF QJSON}nJO.ItemByName('CC').AsString{$ENDIF}
173 ;174 {$ELSE}
175 CompClass := '';176 {$ENDIF}
177 end;178 end;179
180 function_JTDStepField: Boolean;181 var
182 nFName, nFDisplay: String;183 i, nFLength: Integer;184 nFType: Byte;185 nFD: TFieldDef;186 nFRequired: Boolean;187 {$IFDEF SYSJSON}
188 nJA: TJSONArray;189 nJO: TJSONObject;190 nJV: TJSONValue;191 nJP: TJSONPair;192 {$ENDIF}
193 {$IFDEF JSON_SO}
194 nJA: TSuperArray;195 nJO, nJR: ISuperObject;196 {$ENDIF}
197 {$IFDEF QJSON}
198 nJO, nJR: TQJson;199 {$ENDIF}
200 begin
201 Result :=False;202 ADataSet.Close;203
204 {$IFDEF SYSJSON}
205 nJA := nJDS.GetValue('T') asTJSONArray;206 if nJA = nil then
207 Exit;208 {$ENDIF}
209 {$IFDEF JSON_SO}
210 nJO := nJDS.N['T'];211 if nJO.DataType = stNull then
212 Exit;213 {$ENDIF}
214 {$IFDEF QJSON}
215 nJO := nJDS.ItemByName('T');216 if nJO.DataType = jdtNull then
217 Exit;218 {$ENDIF}
219
220 ADataSet.FieldDefs.BeginUpdate;221 try
222 ADataSet.FieldDefs.Clear;223
224 {拆解Field}
225 {$IFDEF SYSJSON}
226 for i := 0 to nJA.Size - 1 do
227 begin
228 nJO := nJA.Get(i) asTJSONObject;229 nFName := nJO.GetValue('N').Value;230 nFDisplay := nJO.GetValue('D').Value;231 nFType := TJSONNumber(nJO.GetValue('T')).AsInt;232 nFLength := TJSONNumber(nJO.GetValue('L')).AsInt;233 nFRequired := Boolean(TJSONNumber(nJO.GetValue('R')).AsInt);234 {$ENDIF}
235 {$IFDEF JSON_SO}
236 nJA :=nJO.AsArray;237 for i := 0 to nJA.Length - 1 do
238 begin
239 nJR :=nJA[i];240 nFName := nJR['N'].AsString;241 nFDisplay := nJR['D'].AsString;242 nFType := nJR['T'].AsInteger;243 nFLength := nJR['L'].AsInteger;244 nFRequired := Boolean(nJR['R'].AsInteger);245 {$ENDIF}
246 {$IFDEF QJSON}
247 for i := 0 to nJO.Count - 1 do
248 begin
249 nJR :=nJO.Items[i];250 nFName := nJR.ItemByName('N').AsString;251 nFDisplay := nJR.ItemByName('D').AsString;252 nFType := nJR.ItemByName('T').AsInteger;253 nFLength := nJR.ItemByName('L').AsInteger;254 nFRequired := Boolean(nJR.ItemByName('R').AsInteger);255 {$ENDIF}
256 nFD :=ADataSet.FieldDefs.AddFieldDef;257 with nFD do
258 try
259 Name :=nFName;260 case nFType of
261 _FT_INTEGER:262 DataType :=ftLargeint;263 _FT_FLOAT:264 DataType :=ftFloat;265 _FT_DATETIME:266 DataType :=ftDateTime;267 _FT_BOOLEAN:268 DataType :=ftBoolean;269 _FT_BLOB:270 DataType :=ftBlob;271 _FT_CURRENCY:272 DataType :=ftCurrency;273 else
274 DataType :=ftString;275 Size :=nFLength;276 end;277 Required :=nFRequired;278 DisplayName :=nFDisplay;279 except
280 DisposeOf;281 end;282 end;283 finally
284 ADataSet.FieldDefs.EndUpdate;285 end;286 Result :=True;287 end;288
289 function_JTDStepRecord: Boolean;290 var
291 nFName, nStr: String;292 i, j: Integer;293 nField: TField;294 nMSI, nMSO: TMemoryStream;295 {$IFDEF 7ZIP}
296 nCItemIndex: Integer;297 nMSC: TMemoryStream; {解压缩用}
298 {$ENDIF}
299 nJRA: {$IFDEF SYSJSON}TJSONArray{$ENDIF}
300 {$IFDEF JSON_SO}TSuperArray{$ENDIF}
301 {$IFDEF QJSON}TQJson{$ENDIF}
302 ;303 {$IFDEF SYSJSON}
304 nJA: TJSONArray;305 {$ENDIF}
306 {$IFDEF JSON_SO}
307 nJA: TSuperArray;308 nJO, nJR: ISuperObject;309 {$ENDIF}
310 {$IFDEF QJSON}
311 nJO: TQJson;312 {$ENDIF}
313 begin
314 Result :=False;315 {$IFDEF SYSJSON}
316 nJA := nJDS.GetValue('R') asTJSONArray;317 if nJA = nil then
318 Exit;319 {$ENDIF}
320 {$IFDEF JSON_SO}
321 nJO := nJDS.N['R'];322 if nJO.DataType = stNull then
323 Exit;324 nJA :=nJO.AsArray;325 {$ENDIF}
326 {$IFDEF QJSON}
327 nJO := nJDS.ItemByName('R');328 if nJO.DataType = jdtNull then
329 Exit;330 {$ENDIF}
331 nMSO := TMemoryStream.Create;332 nMSI := TStringStream.Create;333 {$IFDEF 7ZIP}
334 nMSC := TMemoryStream.Create;335 {$ENDIF}
336 ADataSet.DisableControls;337 try
338 for i := 0 to {$IFDEF SYSJSON}nJA.Size - 1{$ENDIF}
339 {$IFDEF JSON_SO}nJA.Length - 1{$ENDIF}
340 {$IFDEF QJSON}nJO.Count - 1{$ENDIF}
341 do
342 begin
343 nJRA := {$IFDEF SYSJSON}nJA.Get(i) as TJSONArray{$ENDIF}
344 {$IFDEF JSON_SO}nJA[i].AsArray{$ENDIF}
345 {$IFDEF QJSON}nJO.Items[i]{$ENDIF}
346 ;347 ADataSet.Append;348 for j := 0 to ADataSet.Fields.Count - 1 do
349 begin
350 nField :=ADataSet.Fields[j];351 nFName :=nField.FieldName;352 if
353 {$IFDEF SYSJSON}nJRA.Get(j).Null{$ENDIF}
354 {$IFDEF JSON_SO}nJRA[j].DataType = stNull{$ENDIF}
355 {$IFDEF QJSON}nJRA[j].DataType = jdtNull{$ENDIF}
356 then
357 begin
358 nField.SetData(nil);359 end
360 else
361 begin
362 case nField.DataType of
363 ftLargeint:364 begin
365 nField.Value := {$IFDEF SYSJSON}TJSONNumber(nJRA.Get(j)).AsInt64{$ENDIF}
366 {$IFDEF JSON_SO}nJRA[j].AsInteger{$ENDIF}
367 {$IFDEF QJSON}nJRA.Items[j].AsInteger{$ENDIF}
368 ;369 end;370 ftFloat, ftCurrency:371 begin
372 nField.Value := {$IFDEF SYSJSON}TJSONNumber(nJRA.Get(j)).AsDouble{$ENDIF}
373 {$IFDEF JSON_SO}nJRA[j].AsDouble{$ENDIF}
374 {$IFDEF QJSON}nJRA.Items[j].AsFloat{$ENDIF}
375 ;376 end;377 ftDateTime:378 begin
379 nField.Value :=UnixToDateTime(380 {$IFDEF SYSJSON}TJSONNumber(nJRA.Get(j)).AsInt64{$ENDIF}
381 {$IFDEF JSON_SO}nJRA[j].AsInteger{$ENDIF}
382 {$IFDEF QJSON}nJRA.Items[j].AsInt64{$ENDIF}
383 );384 end;385 ftBoolean:386 begin
387 nField.Value :=Boolean(388 {$IFDEF SYSJSON}TJSONNumber(nJRA.Get(j)).AsInt{$ENDIF}
389 {$IFDEF JSON_SO}nJRA[j].AsInteger{$ENDIF}
390 {$IFDEF QJSON}nJRA.Items[j].AsInteger{$ENDIF}
391 );392 end;393 ftBlob:394 begin
395 nMSI.Clear;396 nMSO.Clear;397 nStr := {$IFDEF SYSJSON}TJSONString(nJRA.Get(j)).Value{$ENDIF}
398 {$IFDEF JSON_SO}nJRA[j].AsString{$ENDIF}
399 {$IFDEF QJSON}nJRA.Items[j].AsString{$ENDIF}
400 ;401 nMSI.Write(nStr[1], Length(nStr) *SizeOf(Char));402 nMSI.Position := 0;403 nMSO.Clear;404 {$IFDEF 7ZIP}
405 if nConfig.CompClass = '' then
406 begin
407 {$ENDIF}
408 DecodeStream(nMSI, nMSO);409 {$IFDEF 7ZIP}
410 end
411 else
412 try
413 nMSC.Clear;414 DecodeStream(nMSI, nMSC);415 nMSC.Position := 0;416 with CreateInArchive(TGUID.Create(nConfig.CompClass)) do
417 begin
418 OpenStream(T7zStream.Create(nMSC, soReference));419 for nCItemIndex := 0 to NumberOfItems - 1 do
420 if not ItemIsFolder[nCItemIndex] then
421 begin
422 ExtractItem(nCItemIndex, nMSO, False);423 Break;424 end;425 end;426 except
427 {此处解压缩异常后, 默认不写入数据, 根据实际情况进行处理}
428 nMSO.Clear;429 end;430 {$ENDIF}
431 nMSO.Position := 0;432 TBlobField(nField).LoadFromStream(nMSO);433 end;434 else
435 nField.Value := {$IFDEF SYSJSON}TJSONString(nJRA.Get(j)).Value{$ENDIF}
436 {$IFDEF JSON_SO}nJRA[j].AsString{$ENDIF}
437 {$IFDEF QJSON}nJRA.Items[j].AsString{$ENDIF}
438 ;439 end;440 end;441 end;442 ADataSet.Post;443 end;444 ADataSet.First;445 finally
446 ADataSet.EnableControls;447 nMSO.Free;448 nMSI.Free;449 {$IFDEF 7ZIP}
450 nMSC.Free;451 {$ENDIF}
452 end;453 Result :=True;454 end;455
456 begin
457 if ADataSet = nil then
458 Exit;459
460 {$IFDEF SYSJSON}
461 nJDS := TJSONObject.ParseJSONValue(AJSON) asTJSONObject;462 try
463 {$ENDIF}
464 {$IFDEF JSON_SO}
465 nJDS :=SO(AJSON);466 {$ENDIF}
467 {$IFDEF QJSON}
468 nJDS := TQJson.Create;469 nJDS.Parse(AJSON);470 try
471 {$ENDIF}
472 try
473 _JTDConfig;474
475 if ADataSet is TCustomClientDataSet then
476 begin
477 Result :=_JTDStepField;478 if Result then
479 begin
480 TCustomClientDataSet(ADataSet).CreateDataSet;481 Result :=_JTDStepRecord;482 end;483 end
484 {$IFDEF ADO}
485 else if ADataSet is TADODataSet then
486 begin
487 Result :=_JTDStepField;488 if Result then
489 begin
490 TADODataSet(ADataSet).CreateDataSet;491 Result :=_JTDStepRecord;492 end;493 end
494 {$ENDIF}
495 {$IFDEF FIREDAC}
496 else if ADataSet is TFDDataSet then
497 begin
498 Result :=_JTDStepField;499 if Result then
500 begin
501 TFDDataSet(ADataSet).CreateDataSet;502 Result :=_JTDStepRecord;503 end;504 end
505 {$ENDIF}
506 else
507 Result :=False;508 except
509 Result :=False;510 end;511 {$IFDEF SYSJSON}
512 finally
513 nJDS.Free;514 end;515 {$ENDIF}
516 {$IFDEF QJSON}
517 finally
518 nJDS.Free;519 end;520 {$ENDIF}
521 end;522
523 function DataSetToJSON(ADataSet: TDataSet; varAJSON: WideString): Boolean;524 var
525 nJA, nJRA: {$IFDEF SYSJSON}TJSONArray{$ENDIF}
526 {$IFDEF JSON_SO}TSuperArray{$ENDIF}
527 {$IFDEF QJSON}TQJson{$ENDIF}
528 ;529 nJDS: {$IFDEF SYSJSON}TJSONObject{$ENDIF}
530 {$IFDEF JSON_SO}ISuperObject{$ENDIF}
531 {$IFDEF QJSON}TQJson{$ENDIF}
532 ;533 {$IFDEF SYSJSON}
534 nJO: TJSONObject;535 {$ENDIF}
536 {$IFDEF JSON_SO}
537 nJR: ISuperObject;538 {$ENDIF}
539 i: Integer;540 nTitle, nStr, nFDisplay: string;541 nField: TField;542 nFT: Byte;543 nMSI: TMemoryStream;544 nSSO: TStringStream;545 nCompClassStr: string;546 {$IFDEF 7ZIP}
547 nMSC: TMemoryStream; {解压缩用}
548 {$ENDIF}
549 const
550 _DEF_TITLE = '{"C":{"BC":0,"CC":"%s"},"T":[],"R":[]}';551 _DEf_RECORD = '{"N":"%s","D":"%s","T":%d,"L":%d,"R":%d}';552 begin
553 Result :=False;554 {$IFDEF 7ZIP}
555 nCompClassStr :=CLSID_CFormatGZip.ToString;556 {$ELSE}
557 nCompClassStr := '';558 {$ENDIF}
559 nTitle :=Format(_DEF_TITLE, [nCompClassStr]);560 {$IFDEF SYSJSON}
561 nJDS := TJSONObject.ParseJSONValue(nTitle) asTJSONObject;562 {$ENDIF}
563 {$IFDEF JSON_SO}
564 nJDS :=SO(nTitle);565 {$ENDIF}
566 {$IFDEF QJSON}
567 nJDS := TQJson.Create;568 nJDS.Parse(nTitle);569 {$ENDIF}
570 ADataSet.DisableControls;571 nMSI := TMemoryStream.Create;572 nSSO := TStringStream.Create;573 {$IFDEF 7ZIP}
574 nMSC := TMemoryStream.Create;575 {$ENDIF}
576 try
577 nJA := {$IFDEF SYSJSON}nJDS.GetValue('T') as TJSONArray{$ENDIF}
578 {$IFDEF JSON_SO}nJDS.A['T']{$ENDIF}
579 {$IFDEF QJSON}nJDS.ItemByName('T'){$ENDIF}
580 ;581 AJSON := '';582 try
583 ADataSet.First;584 for i := 0 to ADataSet.Fields.Count - 1 do
585 begin
586 nField :=ADataSet.Fields[i];587 case nField.DataType of
588 ftSmallint, ftInteger, ftWord, ftLargeint, ftLongWord, ftShortint, ftByte:589 nFT :=_FT_INTEGER;590 ftFloat, ftBCD, ftSingle, ftExtended:591 nFT :=_FT_FLOAT;592 ftDate, ftTime, ftDateTime:593 nFT :=_FT_DATETIME;594 ftBoolean:595 nFT :=_FT_BOOLEAN;596 ftBlob, ftMemo, ftGraphic:597 nFT :=_FT_BLOB;598 ftCurrency:599 nFT :=_FT_CURRENCY;600 else
601 nFT :=_FT_STRING;602 end;603 if nField.DisplayLabel = nField.FieldName then
604 nFDisplay := ''
605 else
606 nFDisplay :=nField.DisplayLabel;607 nStr :=Format(_DEf_RECORD, [nField.FieldName, nFDisplay, nFT,608 nField.DataSize, Byte(nField.Required)]);609 {$IFDEF SYSJSON}
610 nJA.AddElement(TJSONObject.ParseJSONValue(nStr));611 {$ENDIF}
612 {$IFDEF JSON_SO}
613 nJA.Add(SO(nStr));614 {$ENDIF}
615 {$IFDEF QJSON}
616 nJA.Add.Parse(nStr);617 {$ENDIF}
618 end;619
620 nJA := {$IFDEF SYSJSON}nJDS.GetValue('R') as TJSONArray{$ENDIF}
621 {$IFDEF JSON_SO}nJDS.A['R']{$ENDIF}
622 {$IFDEF QJSON}nJDS.ItemByName('R'){$ENDIF}
623 ;624 while not ADataSet.Eof do
625 begin
626 {$IFDEF SYSJSON}
627 nJRA := TJSONArray.Create;628 nJA.AddElement(nJRA);629 {$ENDIF}
630 {$IFDEF JSON_SO}
631 nJR :=SA([]);632 nJA.Add(nJR);633 nJRA :=nJR.AsArray;634 {$ENDIF}
635 {$IFDEF QJSON}
636 nJRA := nJA.Add('', jdtArray);637 {$ENDIF}
638 for i := 0 to ADataSet.Fields.Count - 1 do
639 begin
640 nField :=ADataSet.Fields[i];641 if nField.IsNull then
642 begin
643 {$IFDEF SYSJSON}
644 nJRA.AddElement(TJSONNull.Create);645 {$ENDIF}
646 {$IFDEF JSON_SO}
647 nJRA.Add(SO(NULL));648 {$ENDIF}
649 {$IFDEF QJSON}
650 nJRA.Add('', jdtNull);651 {$ENDIF}
652 end
653 else
654 begin
655 case nField.DataType of
656 ftSmallint, ftInteger, ftWord, ftLargeint, ftLongWord, ftShortint, ftByte:657 begin
658 {$IFDEF SYSJSON}
659 nJRA.Add(nField.AsInteger);660 {$ENDIF}
661 {$IFDEF JSON_SO}
662 nJRA.Add(SO(nField.AsInteger));663 {$ENDIF}
664 {$IFDEF QJSON}
665 nJRA.Add.AsInteger :=nField.AsInteger;666 {$ENDIF}
667 end;668 ftFloat, ftBCD, ftSingle, ftExtended, ftCurrency:669 begin
670 {$IFDEF SYSJSON}
671 nJRA.Add(nField.AsFloat);672 {$ENDIF}
673 {$IFDEF JSON_SO}
674 nJRA.Add(SO(nField.AsFloat));675 {$ENDIF}
676 {$IFDEF QJSON}
677 nJRA.Add.AsFloat :=nField.AsFloat;678 {$ENDIF}
679 end;680 ftDate, ftTime, ftDateTime:681 begin
682 {$IFDEF SYSJSON}
683 nJRA.Add(DateTimeToUnix(nField.AsDateTime));684 {$ENDIF}
685 {$IFDEF JSON_SO}
686 nJRA.Add(SO(DateTimeToUnix(nField.AsDateTime)));687 {$ENDIF}
688 {$IFDEF QJSON}
689 nJRA.Add.AsInt64 :=DateTimeToUnix(nField.AsDateTime);690 {$ENDIF}
691 end;692 ftBlob, ftMemo, ftGraphic:693 begin
694 nMSI.Clear;695 nSSO.Clear;696 {$IFDEF 7ZIP}
697 if nCompClassStr <> '' then
698 try
699 nMSC.Clear;700 TBlobField(nField).SaveToStream(nMSC);701 nMSC.Position := 0;702 with CreateOutArchive(TGUID.Create(nCompClassStr)) do
703 begin
704 AddStream(nMSC, soReference, faArchive, CurrentFileTime, CurrentFileTime,705 ExtractFilePath(ParamStr(0)), False, False);706 SaveToStream(nMSI);707 end;708 except
709 nMSI.Clear;710 end
711 else
712 begin
713 {$ENDIF}
714 TBlobField(nField).SaveToStream(nMSI);715 {$IFDEF 7ZIP}
716 end;717 {$ENDIF}
718 nMSI.Position := 0;719 EncodeStream(nMSI, nSSO);720 {$IFDEF SYSJSON}
721 nJRA.Add(nSSO.DataString);722 {$ENDIF}
723 {$IFDEF JSON_SO}
724 nJRA.Add(SO(nSSO.DataString));725 {$ENDIF}
726 {$IFDEF QJSON}
727 nJRA.Add('', nSSO.DataString);728 {$ENDIF}
729 end;730 else
731 {$IFDEF SYSJSON}
732 nJRA.Add(nField.AsString);733 {$ENDIF}
734 {$IFDEF JSON_SO}
735 nJRA.Add(SO(nField.AsString));736 {$ENDIF}
737 {$IFDEF QJSON}
738 nJRA.Add('', nField.AsString);739 {$ENDIF}
740 end;741 end;742 end;743 ADataSet.Next;744 end;745 AJSON := {$IFDEF SYSJSON}nJDS.ToString{$ENDIF}
746 {$IFDEF JSON_SO}nJDS.AsJSon(False, False){$ENDIF}
747 {$IFDEF QJSON}nJDS.Encode(False){$ENDIF}
748 ;749 Result :=True;750 except
751 end;752 finally
753 {$IFDEF 7ZIP}
754 nMSC.Free;755 {$ENDIF}
756 nMSI.Free;757 nSSO.Free;758 ADataSet.EnableControls;759 {$IFDEF SYSJSON}
760 nJDS.Free;761 {$ENDIF}
762 {$IFDEF QJSON}
763 nJDS.Free;764 {$ENDIF}
765 end;766 end;767
768 end.