【问题标题】:Inno Setup: Working with JSONInno 设置:使用 JSON
【发布时间】:2013-03-11 09:43:02
【问题描述】:

如何在安装期间加载和使用 JSON 配置文件?我可以从文件中读取字符串并写入它,但是如果我想更改配置文件中的某些值,我必须使用VBScript.RegExp COM 对象(这很好,但开发起来很痛苦且缓慢)。

当前方法:

ExtractTemporaryFile('config.json');
filename := ExpandConstant('{tmp}\config.json');
LoadStringFromFile(filename, conf);

objRegExp := CreateOleObject('VBScript.RegExp');
objRegExp.Pattern := 'test';
conf := objRegExp.Replace(conf, 'test_replace');
SaveStringToFile(filenameOut, conf, False);

有没有更好的方法来做到这一点?我只需要替换 JSON 对象中的一些值,不需要额外的魔法。

【问题讨论】:

标签: inno-setup pascalscript


【解决方案1】:

我已经设置了名为Inno JSON Config 的新项目,它允许您使用如下所示的简单 JSON 配置文件,并允许您读取和写入字符串、整数和布尔值:

{
    "Section_1":{
            "Key_1": "String 1",
            "Key_2": "1",
            "Key_3": "True"
    },
    "Section_2":{
            "Key_1": "String 2",
            "Key_2": "2",
            "Key_3": "False"
    }
}

用法非常简单(即使我还要添加句柄支持)。请注意,只能使用 Unicode Inno Setup(由于需要 Int64 支持,在最新版本之一中):

[Files]
Source: "JSONConfig.dll"; Flags: dontcopy

[Code]
function JSONQueryString(FileName, Section, Key, Default: WideString;
  var Value: WideString; var ValueLength: Integer): Boolean;
  external 'JSONQueryString@files:jsonconfig.dll stdcall';
function JSONQueryBoolean(FileName, Section, Key: WideString; 
  Default: Boolean; var Value: Boolean): Boolean;
  external 'JSONQueryBoolean@files:jsonconfig.dll stdcall';
function JSONQueryInteger(FileName, Section, Key: WideString; 
  Default: Int64; var Value: Int64): Boolean;
  external 'JSONQueryInteger@files:jsonconfig.dll stdcall';
function JSONWriteString(FileName, Section, Key, 
  Value: WideString): Boolean;
  external 'JSONWriteString@files:jsonconfig.dll stdcall';
function JSONWriteBoolean(FileName, Section, Key: WideString;
  Value: Boolean): Boolean;
  external 'JSONWriteBoolean@files:jsonconfig.dll stdcall';
function JSONWriteInteger(FileName, Section, Key: WideString;
  Value: Int64): Boolean;
  external 'JSONWriteInteger@files:jsonconfig.dll stdcall';

function BoolToStr(Value: Boolean): string;
begin
  Result := 'True';
  if not Value then
    Result := 'False';
end;

procedure InitializeWizard;
var
  FileName: WideString;
  IntValue: Int64;
  StrValue: WideString;
  StrLength: Integer;
  BoolValue: Boolean;
begin
  { set the source JSON config file path }
  FileName := 'c:\Example.json';
  { allocate string buffer to enough length }
  SetLength(StrValue, 16);
  { set the buffer length value }
  StrLength := Length(StrValue);
  { query string value }
  if JSONQueryString(FileName, 'Section_1', 'Key_1', 'Default', StrValue, 
    StrLength)
  then
    MsgBox('Section_1:Key_1=' + StrValue, mbInformation, MB_OK);
  { query integer value }
  if JSONQueryInteger(FileName, 'Section_1', 'Key_2', 0, IntValue) then
    MsgBox('Section_1:Key_2=' + IntToStr(IntValue), mbInformation, MB_OK);
  { query boolean value }
  if JSONQueryBoolean(FileName, 'Section_1', 'Key_3', True, BoolValue) then
    MsgBox('Section_1:Key_3=' + BoolToStr(BoolValue), mbInformation, MB_OK);
  { write string }
  if not JSONWriteString(FileName, 'Section_1', 'Key_1', 'New value!') then
    MsgBox('JSONWriteString Section_1:Key_1 failed!', mbError, MB_OK);
  { write integer }
  if not JSONWriteInteger(FileName, 'Section_1', 'Key_2', 123) then
    MsgBox('JSONWriteInteger Section_1:Key_2 failed!', mbError, MB_OK);
  { write boolean }
  if not JSONWriteBoolean(FileName, 'Section_1', 'Key_3', False) then
    MsgBox('JSONWriteBoolean Section_1:Key_3 failed!', mbError, MB_OK);
end;

【讨论】:

  • 很快(我希望)会准备好Inno JSON Parser。它将使用一个句柄来保持打开的已解析文件(它将使用TInterfaceListISuperObject 接口引用)。它将允许以更灵活的方式处理 JSON 文件。我会在准备好的时候更新这篇文章。已经测试过的代码可以部署了,我只需要完成wiki并添加一些使用示例。我要为 XML 格式编写的类似库。
  • JSONQueryString 也从不检索最后一个字符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多