繁体   English   中英

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

[英]Parsing JSON and Evaluating expressions from its fields

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

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

例如:

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

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

Java 中提供了哪些相同的库?

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

我发现的关于纯数学表达式评估的另一篇有用的文章是 这篇文章。

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

有几个 java 库允许您解析 JSON。 两个主要的是 Jackson-JSON 和 Gson。 两者都是事实上的标准。 我个人的偏好是 Jackson。

这是解析 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();
        }

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM