解析 JSON 并评估其字段中的表达式
Parsing JSON and Evaluating expressions from its fields
我有一个 JSON 文档,我想出了一种使用 JSON-Path
库解析和提取其中值的方法
我必须使用已解析的 JSON 中的变量来评估 rules/expressions。
例如:
{maxAge:25, minAge:20, age:25}
- rule1 : $.maxAge-$.minAge>100 然后发送警报
- 规则 2:$.age<18 然后发送警报
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();
}
}
我有一个 JSON 文档,我想出了一种使用 JSON-Path
库解析和提取其中值的方法我必须使用已解析的 JSON 中的变量来评估 rules/expressions。
例如:
{maxAge:25, minAge:20, age:25}
- rule1 : $.maxAge-$.minAge>100 然后发送警报
- 规则 2:$.age<18 然后发送警报
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();
}
}