Quick.Config.Provider.Json.pas 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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.1
  7. Created : 21/10/2017
  8. Modified : 12/02/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. interface
  23. uses
  24. Classes,
  25. System.SysUtils,
  26. System.IOUtils,
  27. System.Rtti,
  28. {$IF CompilerVersion >= 32.0}
  29. System.JSON.Types,
  30. System.JSON.Serializers,
  31. {$ELSE}
  32. Rest.Json.Types,
  33. System.JSON,
  34. Rest.Json,
  35. {$ENDIF}
  36. Quick.Config;
  37. type
  38. TAppConfigJsonProvider<T: class> = class(TAppConfigProviderBase<T>)
  39. private
  40. fFilename : string;
  41. public
  42. constructor Create(var cConfig : T); override;
  43. property Filename : string read fFilename write fFilename;
  44. procedure Load(var cConfig : T); override;
  45. procedure Save(var cConfig : T); override;
  46. end;
  47. implementation
  48. constructor TAppConfigJsonProvider<T>.Create(var cConfig : T);
  49. begin
  50. inherited Create(cConfig);
  51. fFilename := TPath.ChangeExtension(ParamStr(0),'json');
  52. end;
  53. procedure TAppConfigJsonProvider<T>.Load(var cConfig : T);
  54. var
  55. json : TStrings;
  56. {$IF CompilerVersion >= 32.0}
  57. Serializer : TJsonSerializer;
  58. {$ENDIF}
  59. NewObj : T;
  60. begin
  61. //create object with rtti if nil
  62. //if not Assigned(Config) then Config := InitObject;
  63. if (not FileExists(fFilename)) and (CreateIfNotExists) then
  64. begin
  65. TAppConfig(cConfig).DefaultValues;
  66. Self.Save(cConfig);
  67. end;
  68. try
  69. json := TStringList.Create;
  70. try
  71. json.LoadFromFile(fFilename);
  72. {$IF CompilerVersion >= 32.0}
  73. Serializer := TJsonSerializer.Create;
  74. try
  75. if TAppConfig(cConfig).DateTimeZone = TDateTimeZone.tzLocal then
  76. begin
  77. Serializer.DateTimeZoneHandling := TJsonDateTimeZoneHandling.Local;
  78. Serializer.DateFormatHandling := TJsonDateFormatHandling.FormatSettings;
  79. end
  80. else Serializer.DateTimeZoneHandling := TJsonDateTimeZoneHandling.Utc;
  81. NewObj := Serializer.Deserialize<T>(json.Text);
  82. finally
  83. Serializer.Free;
  84. end;
  85. {$ELSE}
  86. TJson.JsonToObject(cConfig,TJSONObject(TJSONObject.ParseJSONValue(json.Text)));
  87. {$ENDIF}
  88. if Assigned(cConfig) then cConfig.Free;
  89. cConfig := NewObj;
  90. finally
  91. json.Free;
  92. end;
  93. except
  94. on e : Exception do raise e;
  95. end;
  96. end;
  97. procedure TAppConfigJsonProvider<T>.Save(var cConfig : T);
  98. var
  99. json : TStrings;
  100. {$IF CompilerVersion >= 32.0}
  101. Serializer : TJsonSerializer;
  102. {$ENDIF}
  103. ctx : TRttiContext;
  104. rprop : TRttiProperty;
  105. begin
  106. //create object with rtti if nil
  107. if not Assigned(cConfig) then cConfig := InitObject;
  108. try
  109. json := TStringList.Create;
  110. try
  111. {$IF CompilerVersion >= 32.0}
  112. Serializer := TJsonSerializer.Create;
  113. try
  114. if TAppConfig(cConfig).JsonIndent then Serializer.Formatting := TJsonFormatting.Indented;
  115. if TAppConfig(cConfig).DateTimeZone = TDateTimeZone.tzLocal then
  116. begin
  117. Serializer.DateTimeZoneHandling := TJsonDateTimeZoneHandling.Local;
  118. Serializer.DateFormatHandling := TJsonDateFormatHandling.FormatSettings;
  119. end
  120. else Serializer.DateTimeZoneHandling := TJsonDateTimeZoneHandling.Utc;
  121. json.Text := Serializer.Serialize<T>(cConfig);
  122. finally
  123. Serializer.Free;
  124. end;
  125. {$ELSE}
  126. json.Text := TJson.ObjectToJsonString(cConfig);
  127. {$ENDIF}
  128. json.SaveToFile(fFilename);
  129. ctx := TRttiContext.Create;
  130. try
  131. rprop := ctx.GetType(TypeInfo(T)).GetProperty('LastSaved');
  132. rprop.SetValue(TObject(cConfig),TValue.FromVariant(Now()));
  133. finally
  134. ctx.Free;
  135. end;
  136. finally
  137. json.Free;
  138. end;
  139. except
  140. on e : Exception do raise e;
  141. end;
  142. end;
  143. end.