Inno setup Inno设置:使用JSON

Inno setup Inno设置:使用JSON,inno-setup,pascalscript,Inno Setup,Pascalscript,如何在安装期间加载和使用JSON配置文件?我可以从文件中读取字符串并将其写入,但如果我想更改配置文件中的某些值,我必须使用VBScript.RegExpCOM对象(这很好,但很痛苦,开发速度也很慢) 现行方法: ExtractTemporaryFile('config.json'); 文件名:=ExpandConstant('{tmp}\config.json'); LoadStringFromFile(文件名,conf); objRegExp:=CreateOleObject('VBScrip

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

现行方法:

ExtractTemporaryFile('config.json');
文件名:=ExpandConstant('{tmp}\config.json');
LoadStringFromFile(文件名,conf);
objRegExp:=CreateOleObject('VBScript.RegExp');
模式:='test';
conf:=objRegExp.Replace(conf,‘test_Replace’);
SaveStringToFile(filenameOut,conf,False);

有更好的方法吗?我所需要的只是替换JSON对象中的一些值,没有额外的魔力。

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

{
“第1节”:{
“键1”:“字符串1”,
“密钥2”:“1”,
“键3”:“正确”
},
“第2节”:{
“键1”:“字符串2”,
“密钥2”:“2”,
“密钥_3”:“错误”
}
}
用法非常简单(即使我也要添加句柄支持)。请注意,只能使用Unicode Inno设置(由于需要
Int64
支持,因此在最新版本之一中):

[文件]
来源:“JSONConfig.dll”;标志:dontcopy
[守则]
函数JSONQueryString(文件名、节、键、默认值:WideString;
变量值:宽字符串;变量值长度:整数):布尔值;
外部的JSONQueryString@files:jsonconfig.dll stdcall';
函数JSONQueryBoolean(文件名、节、键:WideString;
默认值:布尔;变量值:布尔):布尔;
外部的JSONQueryBoolean@files:jsonconfig.dll stdcall';
函数JSONQueryInteger(文件名、节、键:WideString;
默认值:Int64;变量值:Int64):布尔值;
外部的JSONQueryInteger@files:jsonconfig.dll stdcall';
函数JSONWriteString(文件名、节、键、,
值:宽字符串):布尔值;
外部的JSONWriteString@files:jsonconfig.dll stdcall';
函数jsonwritebolean(文件名、节、键:WideString;
值:Boolean):Boolean;
外部的JSONWriteBoolean@files:jsonconfig.dll stdcall';
函数JSONWriteInteger(文件名、节、键:WideString;
值:Int64):布尔值;
外部的JSONWriteInteger@files:jsonconfig.dll stdcall';
函数BoolToStr(值:Boolean):字符串;
开始
结果:='True';
如果没有价值,那么
结果:='假';
结束;
程序初始化;
变量
文件名:WideString;
IntValue:Int64;
标准值:宽字符串;
StrLength:整数;
布尔值:布尔值;
开始
{设置源JSON配置文件路径}
文件名:=“c:\Example.json”;
{将字符串缓冲区分配到足够的长度}
设定长度(标准值,16);
{设置缓冲区长度值}
StrLength:=长度(StrValue);
{查询字符串值}
如果JSONQueryString(文件名,'Section_1','Key_1','Default',标准值,
StrLength)
然后
MsgBox('Section_1:Key_1='+右值,mbInformation,MB_OK);
{查询整数值}
如果JSONQueryInteger(文件名,'Section_1','Key_2',0,IntValue),则
MsgBox('Section_1:Key_2='+IntToStr(IntValue),mbInformation,MB_OK);
{查询布尔值}
如果JSONQueryBoolean(文件名为'Section_1','Key_3',True,BoolValue),则
MsgBox('Section_1:Key_3='+BoolToStr(BoolValue),mbInformation,MB_OK);
{写入字符串}
如果不是JSONWriteString(文件名,'Section_1','Key_1','New value!'),则
MsgBox('JSONWriteString节_1:键_1失败!',mbError,MB_OK);
{写入整数}
如果不是JSONWriteInteger(文件名为'Section_1','Key_2',123),则
MsgBox('JSONWriteInteger节_1:键_2失败!',mbError,MB_OK);
{写布尔值}
如果不是JSONWriteBolean(文件名为'Section_1','Key_3',False),则
MsgBox('JSONWriteBolean节_1:键_3失败!',mbError,MB_OK);
结束;

很快(我希望)就会准备好。它将使用句柄来保持已解析文件处于打开状态(它将使用
ISuperObject
接口引用的
TInterfaceList
)。它将允许以更灵活的方式处理JSON文件。我会在准备好的时候更新这篇文章。已经测试过的代码可以部署了,我只需要完成wiki并添加一些使用示例。我将为XML格式编写类似的库。另外,JSONQueryString从不检索最后一个字符,但需要缩小JSON文件。另请参阅。