【问题标题】:How to parse a JSON string in Inno Setup?如何在 Inno Setup 中解析 JSON 字符串?
【发布时间】:2023-03-09 19:24:01
【问题描述】:

我有以下 JSON:

{
    "Info": {
        "User": 2,
        "String": "foo"
    }
}

很遗憾,TLama's Inno JSON Config library 不适用于 JSON 字符串,只能用于 json 文件。

我尝试使用 JSON 字符串而不是 json 文件的路径,但没有成功。

if JSONQueryInteger('{"Info":{"User":2,"String":"foo"}}', 'Info', 'User', 0, IntValue) then
    MsgBox('User=' + IntToStr(IntValue), mbInformation, MB_OK);  

我知道我可以将我的 JSON 保存到一个文件中然后解析它,但它看起来有点乱。

如何在 Inno Setup 中解析 JSON 字符串?

【问题讨论】:

    标签: json inno-setup pascalscript


    【解决方案1】:

    您可以改用JsonParser library。它可以解析 JSON 字符串。

    它不像JSONConfig.dll 那样容易使用——但这就是它更灵活的原因。它也是一个原生的 Pascal 脚本代码。因此,它不仅可以将您从临时的 .json 文件中拯救出来,还可以从临时的 .dll 中拯救出来。

    代码可以是这样的:

    [Code]
    
    #include "JsonParser.pas"
    
    function GetJsonRoot(Output: TJsonParserOutput): TJsonObject;
    begin
      Result := Output.Objects[0];
    end;
    
    function FindJsonValue(
      Output: TJsonParserOutput; Parent: TJsonObject; Key: TJsonString;
      var Value: TJsonValue): Boolean;
    var
      I: Integer;
    begin
      for I := 0 to Length(Parent) - 1 do
      begin
        if Parent[I].Key = Key then
        begin
          Value := Parent[I].Value;
          Result := True;
          Exit;
        end;
      end;
    
      Result := False;
    end;
    
    function FindJsonObject(
      Output: TJsonParserOutput; Parent: TJsonObject; Key: TJsonString;
      var Object: TJsonObject): Boolean;
    var
      JsonValue: TJsonValue;
    begin
      Result :=
        FindJsonValue(Output, Parent, Key, JsonValue) and
        (JsonValue.Kind = JVKObject);
    
      if Result then
      begin
        Object := Output.Objects[JsonValue.Index];
      end;
    end;
    
    function FindJsonNumber(
      Output: TJsonParserOutput; Parent: TJsonObject; Key: TJsonString;
      var Number: TJsonNumber): Boolean;
    var
      JsonValue: TJsonValue;
    begin
      Result :=
        FindJsonValue(Output, Parent, Key, JsonValue) and
        (JsonValue.Kind = JVKNumber);
    
      if Result then
      begin
        Number := Output.Numbers[JsonValue.Index];
      end;
    end;
    
    function FindJsonString(
      Output: TJsonParserOutput; Parent: TJsonObject; Key: TJsonString;
      var Str: TJsonString): Boolean;
    var
      JsonValue: TJsonValue;
    begin
      Result :=
        FindJsonValue(Output, Parent, Key, JsonValue) and
        (JsonValue.Kind = JVKString);
      if Result then
      begin
        Str := Output.Strings[JsonValue.Index];
      end;
    end;
    
    function ParseJsonAndLogErrors(
      var JsonParser: TJsonParser; const Source: WideString): Boolean;
    var
      I: Integer;
    begin
      ParseJson(JsonParser, Source);
    
      Result := (Length(JsonParser.Output.Errors) = 0);
      if not Result then
      begin
        Log('Error parsing JSON');
        for I := 0 to Length(JsonParser.Output.Errors) - 1 do
        begin
          Log(JsonParser.Output.Errors[I]);
        end;
      end;
    end;
    
    procedure ParseJsonString;
    var
      Json: string;
      JsonParser: TJsonParser;
      I: Integer;
      JsonRoot, InfoObject: TJsonObject;
      UserNumber: TJsonNumber; { = Double }
      UserString: TJsonString; { = WideString = string }
    begin
      Json := '{"Info":{"User":2,"String":"abc"}}';
    
      if ParseJsonAndLogErrors(JsonParser, Json) then
      begin
        JsonRoot := GetJsonRoot(JsonParser.Output);
        if FindJsonObject(JsonParser.Output, JsonRoot, 'Info', InfoObject) and
           FindJsonNumber(JsonParser.Output, InfoObject, 'User', UserNumber) and
           FindJsonString(JsonParser.Output, InfoObject, 'String', UserString) then
        begin
          Log(Format('Info:User:%d', [Round(UserNumber)]));
          Log(Format('Info:String:%s', [UserString]));
        end;
      end;
    
      ClearJsonParser(JsonParser);
    end;
    

    另一种选择是 fork Inno JSON Config 库并添加对解析字符串的支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-11
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      相关资源
      最近更新 更多