Quick.Config.Json.pas 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. { ***************************************************************************
  2. Copyright (c) 2015-2019 Kike Pérez
  3. Unit : Quick.Config.Json
  4. Description : Save config to JSON file
  5. Author : Kike Pérez
  6. Version : 1.5
  7. Created : 21/10/2017
  8. Modified : 17/01/2019
  9. This file is part of QuickLib: https://github.com/exilon/QuickLib
  10. ***************************************************************************
  11. Licensed under the Apache License, Version 2.0 (the "License");
  12. you may not use this file except in compliance with the License.
  13. You may obtain a copy of the License at
  14. http://www.apache.org/licenses/LICENSE-2.0
  15. Unless required by applicable law or agreed to in writing, software
  16. distributed under the License is distributed on an "AS IS" BASIS,
  17. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18. See the License for the specific language governing permissions and
  19. limitations under the License.
  20. *************************************************************************** }
  21. unit Quick.Config.Json;
  22. {$i QuickLib.inc}
  23. interface
  24. uses
  25. Classes,
  26. SysUtils,
  27. {$IFDEF DELPHIXE_UP}
  28. IOUtils,
  29. {$ELSE}
  30. Quick.Files,
  31. {$ENDIF}
  32. Rtti,
  33. Quick.Json.Serializer,
  34. {$IFDEF FPC}
  35. fpjson,
  36. fpjsonrtti,
  37. {$ELSE}
  38. Rest.Json.Types,
  39. System.JSON,
  40. {$ENDIF}
  41. Quick.Config.Base;
  42. type
  43. TAppConfigJsonProvider = class(TAppConfigProvider)
  44. private
  45. fFilename : string;
  46. procedure Load(cConfig : TAppConfig); override;
  47. procedure Save(cConfig : TAppConfig); override;
  48. public
  49. constructor Create(const aFilename : string = ''); virtual;
  50. property Filename : string read fFilename write fFilename;
  51. end;
  52. TAppConfigJson = class(TAppConfig)
  53. private
  54. function GetProvider : TAppConfigJsonProvider;
  55. public
  56. constructor Create(const aFileName : string = ''); overload; virtual;
  57. destructor Destroy; override;
  58. property Provider : TAppConfigJsonProvider read GetProvider;
  59. end;
  60. {Usage: create a descend class from TAppConfigJson and add published properties to be loaded/saved
  61. TMyConfig = class(TAppConfigJson)
  62. private
  63. fName : string;
  64. fSurname : string;
  65. fStatus : Integer;
  66. published
  67. property Name : string read fName write fName;
  68. property SurName : string read fSurname write fSurname;
  69. property Status : Integer read fStatus write fStatus;
  70. end;
  71. MyConfig := TMyConfig.Create;
  72. MyConfig.Provider.FileName := '.\MyAppName.json';
  73. MyConfig.Name := 'John';
  74. MyConfig.Save;
  75. }
  76. implementation
  77. constructor TAppConfigJsonProvider.Create(const aFilename : string = '');
  78. begin
  79. inherited Create;
  80. if aFilename = '' then fFilename := TPath.ChangeExtension(ParamStr(0),'json')
  81. else fFilename := aFilename;
  82. end;
  83. procedure TAppConfigJsonProvider.Load(cConfig : TAppConfig);
  84. var
  85. json : TStrings;
  86. Serializer : TJsonSerializer;
  87. begin
  88. //create object with rtti if nil
  89. //if not Assigned(Config) then Config := InitObject;
  90. if (not FileExists(fFilename)) and (CreateIfNotExists) then
  91. begin
  92. TAppConfig(cConfig).DefaultValues;
  93. Self.Save(cConfig);
  94. end;
  95. try
  96. json := TStringList.Create;
  97. try
  98. json.LoadFromFile(fFilename);
  99. serializer := TJsonSerializer.Create(slPublishedProperty);
  100. try
  101. //Streamer.Options := Streamer.Options + [jsoDateTimeAsString ,jsoUseFormatString];
  102. //Streamer.DateTimeFormat := 'yyyy-mm-dd"T"hh:mm:ss.zz';
  103. serializer.JsonToObject(cConfig,json.Text);
  104. finally
  105. serializer.Free;
  106. end;
  107. finally
  108. json.Free;
  109. end;
  110. except
  111. on e : Exception do raise e;
  112. end;
  113. end;
  114. procedure TAppConfigJsonProvider.Save(cConfig : TAppConfig);
  115. var
  116. json : TStrings;
  117. Serializer : TJsonSerializer;
  118. ctx : TRttiContext;
  119. rprop : TRttiProperty;
  120. begin
  121. //create object with rtti if nil
  122. if not Assigned(cConfig) then cConfig := TAppConfigJson.Create;
  123. try
  124. json := TStringList.Create;
  125. try
  126. serializer := TJsonSerializer.Create(TSerializeLevel.slPublishedProperty);
  127. try
  128. //Streamer.Options := Streamer.Options + [jsoDateTimeAsString ,jsoUseFormatString];
  129. //Streamer.DateTimeFormat := 'yyyy-mm-dd"T"hh:mm:ss.zz';
  130. json.Text := serializer.ObjectToJson(cConfig,True);
  131. finally
  132. serializer.Free;
  133. end;
  134. json.SaveToFile(fFilename);
  135. cConfig.LastSaved := Now;
  136. finally
  137. json.Free;
  138. end;
  139. except
  140. on e : Exception do raise e;
  141. end;
  142. end;
  143. { TAppConfigJson }
  144. constructor TAppConfigJson.Create(const aFileName : string = '');
  145. begin
  146. inherited Create(TAppConfigJsonProvider.Create(aFileName));
  147. end;
  148. destructor TAppConfigJson.Destroy;
  149. begin
  150. inherited;
  151. end;
  152. function TAppConfigJson.GetProvider: TAppConfigJsonProvider;
  153. begin
  154. Result := TAppConfigJsonProvider(fProvider);
  155. end;
  156. end.