Quick.Config.Provider.Json.pas 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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. Quick.Json.Serializer,
  38. {$IFDEF FPC}
  39. fpjson,
  40. fpjsonrtti,
  41. {$ELSE}
  42. Rest.Json.Types,
  43. System.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. Serializer : TJsonSerializer;
  67. NewObj : T;
  68. begin
  69. //create object with rtti if nil
  70. //if not Assigned(Config) then Config := InitObject;
  71. if (not FileExists(fFilename)) and (CreateIfNotExists) then
  72. begin
  73. TAppConfig(cConfig).DefaultValues;
  74. Self.Save(cConfig);
  75. end;
  76. try
  77. json := TStringList.Create;
  78. try
  79. json.LoadFromFile(fFilename);
  80. {$IFDEF DELPHIRX102_UP}
  81. Serializer := TJsonSerializer.Create;
  82. try
  83. if TAppConfig(cConfig).DateTimeZone = TDateTimeZone.tzLocal then
  84. begin
  85. Serializer.DateTimeZoneHandling := TJsonDateTimeZoneHandling.Local;
  86. Serializer.DateFormatHandling := TJsonDateFormatHandling.FormatSettings;
  87. end
  88. else Serializer.DateTimeZoneHandling := TJsonDateTimeZoneHandling.Utc;
  89. NewObj := Serializer.Deserialize<T>(json.Text);
  90. finally
  91. Serializer.Free;
  92. end;
  93. {$ELSE}
  94. serializer := TJsonSerializer.Create(slPublishedProperty);
  95. try
  96. //Streamer.Options := Streamer.Options + [jsoDateTimeAsString ,jsoUseFormatString];
  97. //Streamer.DateTimeFormat := 'yyyy-mm-dd"T"hh:mm:ss.zz';
  98. serializer.JsonToObject(cConfig,json.Text);
  99. Exit;
  100. finally
  101. serializer.Free;
  102. end;
  103. {$ENDIF}
  104. if Assigned(cConfig) then cConfig.Free;
  105. cConfig := NewObj;
  106. finally
  107. json.Free;
  108. end;
  109. except
  110. on e : Exception do raise e;
  111. end;
  112. end;
  113. procedure TAppConfigJsonProvider<T>.Save(var cConfig : T);
  114. var
  115. json : TStrings;
  116. Serializer : TJsonSerializer;
  117. ctx : TRttiContext;
  118. rprop : TRttiProperty;
  119. begin
  120. //create object with rtti if nil
  121. if not Assigned(cConfig) then cConfig := InitObject;
  122. try
  123. json := TStringList.Create;
  124. try
  125. {$IFDEF DELPHIRX102_UP}
  126. Serializer := TJsonSerializer.Create;
  127. try
  128. if TAppConfig(cConfig).JsonIndent then Serializer.Formatting := TJsonFormatting.Indented;
  129. if TAppConfig(cConfig).DateTimeZone = TDateTimeZone.tzLocal then
  130. begin
  131. Serializer.DateTimeZoneHandling := TJsonDateTimeZoneHandling.Local;
  132. Serializer.DateFormatHandling := TJsonDateFormatHandling.FormatSettings;
  133. end
  134. else Serializer.DateTimeZoneHandling := TJsonDateTimeZoneHandling.Utc;
  135. json.Text := Serializer.Serialize<T>(cConfig);
  136. finally
  137. Serializer.Free;
  138. end;
  139. {$ELSE}
  140. serializer := TJsonSerializer.Create(TSerializeLevel.slPublishedProperty);
  141. try
  142. //Streamer.Options := Streamer.Options + [jsoDateTimeAsString ,jsoUseFormatString];
  143. //Streamer.DateTimeFormat := 'yyyy-mm-dd"T"hh:mm:ss.zz';
  144. json.Text := serializer.ObjectToJson(cConfig);
  145. finally
  146. serializer.Free;
  147. end;
  148. {$ENDIF}
  149. json.SaveToFile(fFilename);
  150. {$IFDEF FPC}
  151. //TAppConfig(cConfig).LastSaved := Now;
  152. {$ELSE}
  153. ctx := TRttiContext.Create;
  154. try
  155. rprop := ctx.GetType(TypeInfo(T)).GetProperty('LastSaved');
  156. rprop.SetValue(TObject(cConfig),TValue.FromVariant(Now()));
  157. finally
  158. ctx.Free;
  159. end;
  160. {$ENDIF}
  161. finally
  162. json.Free;
  163. end;
  164. except
  165. on e : Exception do raise e;
  166. end;
  167. end;
  168. end.