解析 JSON 并评估其字段中的表达式

Parsing JSON and Evaluating expressions from its fields

我有一个 JSON 文档,我想出了一种使用 JSON-Path

库解析和提取其中值的方法

我必须使用已解析的 JSON 中的变量来评估 rules/expressions。

例如:

{maxAge:25, minAge:20, age:25}

Java 中有哪些可用的库?

Json 路径只会让您解析 JSON 文件并读取其中的变量。您必须使用单独的 Java 库来评估表达式。看看这个 post 讨论相同。

我在纯数学表达式求值中发现的另一个有用 post 是 this 一个。

如果您能识别将成为表达式一部分的所有运算符,将会很有帮助。例如,算术运算符(+、-、/、*。)、相等和关系运算符(=、!=、<、>)

有几个 java 库可让您解析 JSON。两个主要的是 Jackson-JSON 和 Gson。两者都是事实上的标准。我个人比较喜欢杰克逊。

这里是最简单的解析方式JSON:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModules(new JavaTimeModule());
ObjectReader objectReader= objectMapper.reader();
Map<String, Object>data = objectReader.forType(Map.class).readValue(s);

这是所需的 Maven 工件

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.12.3</version>        
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.12.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
  <version>2.12.3</version>
</dependency>

这里是 github 站点:https://github.com/FasterXML/jackson
这里是相关的 Javadoc

想出了一个办法,显然,我不需要 JSON 路径。我可以直接在我的代码中使用 javascript。所以我在 javascript

中写了规则
public static void main(String[] args) {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
        String json = "{\"maxAge\":25, \"minAge\":20, \"age\":25}";
        String rule = "(x.maxAge)-(x.minAge) > 0;";

        jsEngine.put("x", json);

        try {
            jsEngine.eval("function test(abc){" + "var x=JSON.parse(abc);" + "return " + rule + "}");

            Invocable inv = (Invocable) jsEngine;
            boolean result = (Boolean) inv.invokeFunction("test", json);
            if (result) {
                System.out.println("Alert rule triggered");
            }

        } catch (ScriptException ex) {
            ex.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

    }