【问题标题】:Parsing JSON and Evaluating expressions from its fields解析 JSON 并从其字段中评估表达式
【发布时间】:2021-08-13 18:11:22
【问题描述】:

我有一个 JSON 文档,我从中找到了一种使用 JSON-Path 库解析和提取其中值的方法

我必须使用解析后的 JSON 中的变量来评估规则/表达式。

例如:

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

  • rule1 : $.maxAge-$.minAge>100 然后发送警报
  • rule2 : $.age

Java 中有哪些库可用于相同的功能?

【问题讨论】:

  • 您的问题是什么?你有没有尝试过实现它?
  • 问题是要有一个简单的java程序来评估类似于上面提到的规则并生成警报。我被困在规则评估部分。
  • 规则将从属性文件中读取。我使用的 JSON 路径不一定是 JSON 路径。可以很简单

标签: java json spring expression-evaluation


【解决方案1】:

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

我发现的另一篇关于纯数学表达式评估的有用帖子是this one。

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

【讨论】:

    【解决方案2】:

    有几个 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

    【讨论】:

      【解决方案3】:

      想办法,显然,我不需要 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();
              }
      
          }
      

      【讨论】:

        猜你喜欢
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-17
        • 1970-01-01
        相关资源
        最近更新 更多