1

我有这个 JavaScript 文件:

var input = {
  "CONTRATE": 0,
  "SALINC": 0,
  "RETAGE": 55.34,
  "MARSTATUS": "single",
  "SPOUSEDOB": "1970-01-01",
  "VIEWOPTION": "pension"
};

var inputValidation = "input.CONTRATE > 50 && input.SALINC < 50 && input.RETAGE > 50";

eval(inputValidation);

如何使用 JINT 作为 JSON 对象字符串获取“输入”变量的 JSON 值?

4

1 回答 1

3

我相信我们可以通过 3 种方式达到预期的效果

方法 1 - 使用 Jint 的内置解析器

Jint 有内置的解析器来支持javascriptJSON.parseJSON.stringify函数。我们可以将它们用于此任务:

        var engine =new Engine();

        var json = @"{
              ""CONTRATE"": 0,
              ""SALINC"": 0,
              ""RETAGE"": 55.34,
              ""MARSTATUS"": ""single"",
              ""SPOUSEDOB"": ""1970-01-01"",
              ""VIEWOPTION"": ""pension""
            }";

        var input = new JsonParser(engine).Parse(json);

        var result= engine
            .SetValue("input", input)
            .Execute("input.CONTRATE > 50 && input.SALINC < 50 && input.RETAGE > 50")
            .GetCompletionValue().AsBoolean();

方法 2 - 使用 3rdParty Json 序列化程序

Jint 接受 POCO 对象作为输入,因此我们可以首先将 json 转换为 POCO,然后将其提供给 Jint 以获取结果(对于本示例,我使用 Json.net 作为反序列化器)

        var input = Newtonsoft.Json.JsonConvert.DeserializeObject(json);
        var result= engine
            .SetValue("input", input)
            .Execute("input.CONTRATE > 50 && input.SALINC < 50 && input.RETAGE > 50")
            .GetCompletionValue().AsBoolean(); 

方法 3 - 将 JSON 对象放入评估脚本

或者正如 Mr.Ros(Jint 的作者)建议的那样,我们可以将 JSON 对象和条件放在同一个脚本中,并将其传递给 Jint 进行评估。

        var engine = new Engine();

        var js = @"
         input={
          ""CONTRATE"": 0,
          ""SALINC"": 0,
          ""RETAGE"": 55.34,
          ""MARSTATUS"": ""single"",
          ""SPOUSEDOB"": ""1970-01-01"",
          ""VIEWOPTION"": ""pension""
        };

        input.CONTRATE > 50 && input.SALINC < 50 && input.RETAGE > 50;";

        var result = engine
            .Execute(js)
            .GetCompletionValue().AsBoolean();
于 2015-06-05T06:25:27.857 回答