Quick.Config.Provider.Json.pas 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. { ***************************************************************************
  2. Copyright (c) 2015-2018 Kike Pérez
  3. Unit : Quick.Config.Provider.Json
  4. Description : Save config to JSON file
  5. Author : Kike Pérez
  6. Version : 1.2
  7. Created : 21/10/2017
  8. Modified : 07/04/2018
  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.Provider.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. {$IFDEF DELPHIRX102_UP}
  34. System.JSON.Types,
  35. System.JSON.Serializers,
  36. {$ELSE}
  37. {$IFDEF FPC}
  38. fpjson,
  39. fpjsonrtti,
  40. {$ELSE}
  41. Rest.Json.Types,
  42. System.JSON,
  43. Rest.Json,
  44. {$ENDIF}
  45. {$ENDIF}
  46. Quick.Config;
  47. type
  48. TAppConfigJsonProvider<T: class> = class(TAppConfigProviderBase<T>)
  49. private
  50. fFilename : string;
  51. public
  52. constructor Create(var cConfig : T); override;
  53. property Filename : string read fFilename write fFilename;
  54. procedure Load(var cConfig : T); override;
  55. procedure Save(var cConfig : T); override;
  56. end;
  57. implementation
  58. constructor TAppConfigJsonProvider<T>.Create(var cConfig : T);
  59. begin
  60. inherited Create(cConfig);
  61. fFilename := TPath.ChangeExtension(ParamStr(0),'json');
  62. end;
  63. procedure TAppConfigJsonProvider<T>.Load(var cConfig : T);
  64. var
  65. json : TStrings;
  66. {$IFDEF DELPHIRX102_UP}
  67. Serializer : TJsonSerializer;
  68. {$ENDIF}
  69. {$IFDEF FPC}
  70. streamer : TJSONDeStreamer;
  71. {$ENDIF}
  72. NewObj : T;
  73. begin
  74. //create object with rtti if nil
  75. //if not Assigned(Config) then Config := InitObject;
  76. if (not FileExists(fFilename)) and (CreateIfNotExists) then
  77. begin
  78. TAppConfig(cConfig).DefaultValues;
  79. Self.Save(cConfig);
  80. end;
  81. try
  82. json := TStringList.Create;
  83. try
  84. json.LoadFromFile(fFilename);
  85. {$IFDEF DELPHIRX102_UP}
  86. Serializer := TJsonSerializer.Create;
  87. try
  88. if TAppConfig(cConfig).DateTimeZone = TDateTimeZone.tzLocal then
  89. begin
  90. Serializer.DateTimeZoneHandling := TJsonDateTimeZoneHandling.Local;
  91. Serializer.DateFormatHandling := TJsonDateFormatHandling.FormatSettings;
  92. end
  93. else Serializer.DateTimeZoneHandling := TJsonDateTimeZoneHandling.Utc;
  94. NewObj := Serializer.Deserialize<T>(json.Text);
  95. finally
  96. Serializer.Free;
  97. end;
  98. {$ELSE}
  99. {$IFDEF FPC}
  100. streamer := TJSONDeStreamer.Create(nil);
  101. try
  102. //Streamer.Options := Streamer. .Options + [jsoDateTimeAsString ,jsoUseFormatString];
  103. Streamer.DateTimeFormat := 'yyyy-mm-dd"T"hh:mm:ss.zz';
  104. Streamer.JsonToObject(json.Text,NewObj);
  105. finally
  106. Streamer.Free;
  107. end;
  108. {$ELSE}
  109. TJson.JsonToObject(Self,TJSONObject(TJSONObject.ParseJSONValue(json)));
  110. {$ENDIF}
  111. {$ENDIF}
  112. if Assigned(cConfig) then cConfig.Free;
  113. cConfig := NewObj;
  114. finally
  115. json.Free;
  116. end;
  117. except
  118. on e : Exception do raise e;
  119. end;
  120. end;
  121. procedure TAppConfigJsonProvider<T>.Save(var cConfig : T);
  122. var
  123. json : TStrings;
  124. {$IFDEF DELPHIRX102_UP}
  125. Serializer : TJsonSerializer;
  126. {$ENDIF}
  127. {$IFDEF FPC}
  128. streamer : TJsonStreamer;
  129. {$ENDIF}
  130. ctx : TRttiContext;
  131. rprop : TRttiProperty;
  132. begin
  133. //create object with rtti if nil
  134. if not Assigned(cConfig) then cConfig := InitObject;
  135. try
  136. json := TStringList.Create;
  137. try
  138. {$IFDEF DELPHIRX102_UP}
  139. Serializer := TJsonSerializer.Create;
  140. try
  141. if TAppConfig(cConfig).JsonIndent then Serializer.Formatting := TJsonFormatting.Indented;
  142. if TAppConfig(cConfig).DateTimeZone = TDateTimeZone.tzLocal then
  143. begin
  144. Serializer.DateTimeZoneHandling := TJsonDateTimeZoneHandling.Local;
  145. Serializer.DateFormatHandling := TJsonDateFormatHandling.FormatSettings;
  146. end
  147. else Serializer.DateTimeZoneHandling := TJsonDateTimeZoneHandling.Utc;
  148. json.Text := Serializer.Serialize<T>(cConfig);
  149. finally
  150. Serializer.Free;
  151. end;
  152. {$ELSE}
  153. {$IFDEF FPC}
  154. streamer := TJsonStreamer.Create(nil);
  155. try
  156. Streamer.Options := Streamer.Options + [jsoDateTimeAsString ,jsoUseFormatString];
  157. Streamer.DateTimeFormat := 'yyyy-mm-dd"T"hh:mm:ss.zz';
  158. json.Text := streamer.ObjectToJSONString(cConfig);
  159. finally
  160. streamer.Free;
  161. end;
  162. {$ELSE}
  163. json.Text := TJson.ObjectToJsonString(cConfig);
  164. {$ENDIF}
  165. {$ENDIF}
  166. json.SaveToFile(fFilename);
  167. {$IFDEF FPC}
  168. //TAppConfig(cConfig).LastSaved := Now;
  169. {$ELSE}
  170. ctx := TRttiContext.Create;
  171. try
  172. rprop := ctx.GetType(TypeInfo(T)).GetProperty('LastSaved');
  173. rprop.SetValue(TObject(cConfig),TValue.FromVariant(Now()));
  174. finally
  175. ctx.Free;
  176. end;
  177. {$ENDIF}
  178. finally
  179. json.Free;
  180. end;
  181. except
  182. on e : Exception do raise e;
  183. end;
  184. end;
  185. end.