2013-03-11 21 views
6

Yükleme süresi boyunca JSON yapılandırma dosyasını nasıl yükleyebilirim? Dosyadan string okuyabilir ve yazabilirim, ama eğer config dosyasındaki bir değeri değiştirmek istersem, VBScript.RegExp COM nesnesini kullanmalıyım (ki bu iyi, ama acı verici ve gelişmesi yavaştır).Inno Kurulumu: JSON ile Çalışmak

Güncel yöntemi:

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); 

Bunu yapmak için daha iyi bir yolu var mı? Tek ihtiyacım olan şey, JSON nesnesindeki bazı değerleri değiştirmek, fazladan büyü yapmamak.

+0

Inno herhangi bir yerel JSON desteği yok, ancak ayrıştırmak gibi değiştirebilirsiniz: (nedeniyle gerekli Int64 desteğine en son sürümleri birinde) yalnızca Unicode Inno Setup kullanılabileceğini, Not tekrar yazmadan önce normal bir dize. Regexp modülü sizin için en kolay yol ise o zaman bu kadar olsun. – Deanna

+1

Sadece bilinen bir benzersiz işaretçiyi aramak ve değiştirmek istiyorsanız, 'StringChange' veya' StringChangeEx' işlevini kullanın. Arama metnini benzersiz yapamadığınız sürece normal ifadelere gerek yoktur. – Miral

cevap

9

Ben setup aşağıda gösterilen gibi basit JSON yapılandırma dosyaları ile çalışma olanağı sağlar Inno JSON Config denilen yeni bir proje, ettik ve okuyup dize, tamsayı ve mantıksal değerler yazmak için izin veren:

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

kullanım oldukça basittir (sap desteğini de ekleyeceğim zaman bile).

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

[Code] 
function JSONQueryString(FileName, Section, Key, Default: WideString; 
    var Value: WideString; var ValueLength: Integer): Boolean; 
    external '[email protected]:jsonconfig.dll stdcall'; 
function JSONQueryBoolean(FileName, Section, Key: WideString; 
    Default: Boolean; var Value: Boolean): Boolean; 
    external '[email protected]:jsonconfig.dll stdcall'; 
function JSONQueryInteger(FileName, Section, Key: WideString; 
    Default: Int64; var Value: Int64): Boolean; 
    external '[email protected]:jsonconfig.dll stdcall'; 
function JSONWriteString(FileName, Section, Key, 
    Value: WideString): Boolean; 
    external '[email protected]:jsonconfig.dll stdcall'; 
function JSONWriteBoolean(FileName, Section, Key: WideString; 
    Value: Boolean): Boolean; 
    external '[email protected]:jsonconfig.dll stdcall'; 
function JSONWriteInteger(FileName, Section, Key: WideString; 
    Value: Int64): Boolean; 
    external '[email protected]: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; 
+1

Henüz bir başlangıç ​​sürümü olarak ele alın, bununla ilgilenilecekse büyüyebilir. – TLama

+0

çok harikasın! Çok teşekkür ederim! Sonraki referans için – phantasm

+0

: https://code.google.com/p/superobject/ – phantasm

İlgili konular