根据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)
括号不需要自己的表达式

下面是And表达式的外观示例。它只是遵从两个委托并执行逻辑and

下面的代码都假定使用,但您可以使用任何json解析库

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")
);