微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决解析 JSON 并从其字段评估表达式

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

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

例如:

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

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

Java 中有哪些可用的库?

解决方法

Json Path 只会让您解析 JSON 文件并读取其中的变量。您必须使用单独的 Java 库来评估表达式。看看讨论相同内容的这个 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();
        }

    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。