根据Java8中的逻辑表达式验证JSON
我有一个字符串格式的表达式根据Java8中的逻辑表达式验证JSON,java,java-8,expression,expression-evaluation,Java,Java 8,Expression,Expression Evaluation,我有一个字符串格式的表达式 String exp = "(weight > 50 && height > 150 && height < 160) || BP = 130"; 我将如何验证用户;将JSON详细信息与上述表达式进行比较。 我期望基于表达式验证的结果为真/假。如果您了解到没有这样的事情可以完全按照您的意愿来做,您可能不会感到惊讶。你得自己写 有两个主要步骤:解析器和解释器。构造此代码的逻辑方法是使用 您应该建立一个表达式序列,每个表
String exp = "(weight > 50 && height > 150 && height < 160) || BP = 130";
我将如何验证用户;将JSON详细信息与上述表达式进行比较。
我期望基于表达式验证的结果为真/假。如果您了解到没有这样的事情可以完全按照您的意愿来做,您可能不会感到惊讶。你得自己写 有两个主要步骤:解析器和解释器。构造此代码的逻辑方法是使用 您应该建立一个表达式序列,每个表达式都能够说明它是否匹配给定的json
interface Expression {
boolean matches(JsonObject json);
}
例如,您需要:
- 大于表达式(键>值)
- 小于表达式(键
- 等于表达式(key=val)
- 和表达式(expr和expr2)
- 或表达式(expr | | expr2)
class AndExpression implements Expression {
private final Expression a;
private final Expression b;
AndExpression(Expression a, Expression b) {
this.a = a;
this.b = b;
}
@Override
public boolean matches(JsonObject json) {
return a.matches(json) && b.matches(json);
}
}
equals表达式稍微复杂一些。它需要查找键的存在,获取值,然后执行比较
class EqualsExpression implements Expression {
private final String key;
private final String value;
EqualsExpression(String key, String value) {
this.key = key;
this.value = value;
}
@Override
public boolean matches(JsonObject json) {
if (json.has(key)) {
final JsonElement elem = json.get(key);
if (elem.isJsonPrimitive()) {
return elem.getAsJsonPrimitive().getAsString().equals(value);
}
}
return false;
}
}
要建模表达式foo=bar&&bar=baz
,可以将这两个类组合在一起,如下所示:
Expression fullExpression = new AndExpression(
new EqualsExpression("foo", "bar"),
new EqualsExpression("bar", "baz")
);
您将需要实现其他3个表达式,根据我给您的内容,这应该是微不足道的,并且需要一个解析器根据您的文本输入动态创建和组合表达式 我从那个人那里得到了确切的答案。ExecutableStatement语句=(ExecutableStatement)MVEL.compileExpression(ruleExpression.toString());布尔结果=(布尔)MVEL.executeExpression(语句,用户);}
Expression fullExpression = new AndExpression(
new EqualsExpression("foo", "bar"),
new EqualsExpression("bar", "baz")
);