【问题标题】:Validate JSON against a logical expression in Java8 [duplicate]根据 Java8 中的逻辑表达式验证 JSON [重复]
【发布时间】:2019-12-13 10:55:38
【问题描述】:

我有一个字符串格式的表达式。

String exp = "(weight > 50 && height > 150 && height < 160) || BP = 130";

我从一个 JSON 对象创建了这个字符串。因此可以灵活地转换为任何格式。

现在我有一个 JSON 格式的用户数据。

{
  "weight": 55,
  "height": 155,
  "BP": 130
}

我将如何根据上述表达式验证用户的 JSON 详细信息。 我期待基于表达式验证的真/假结果。

【问题讨论】:

  • 我从那个人那里得到了确切的答案。 ExecutableStatement 语句 = (ExecutableStatement) MVEL.compileExpression(ruleExpression.toString());布尔结果 = (Boolean) MVEL.executeExpression(statement, user);}

标签: java java-8 expression expression-evaluation


【解决方案1】:

得知没有这样的事情可以完全按照您的意愿去做,您应该不会感到惊讶。你必须自己写。

有两个主要步骤:解析器和解释器。构建此代码的逻辑方法是使用interpreter pattern

你应该建立一个表达式序列,每个表达式都能够说明它是否与给定的 json 匹配。

interface Expression {
    boolean matches(JsonObject json);
}

对于您的示例,您将需要:

  • 大于表达式(key > val)
  • 小于表达式(键
  • 等于表达式(key = val)
  • 表达式(expr && expr2)
  • 表达式(expr || expr2)

括号不需要自己的表达式。

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

以下代码均假设使用Gson,但你可以使用任何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 表达式有点复杂。需要寻找key的存在,获取value,进行比较。

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 &amp;&amp; bar = baz 建模,您可以像这样将这两个类组合在一起:

Expression fullExpression = new AndExpression(
    new EqualsExpression("foo", "bar"),
    new EqualsExpression("bar", "baz")
);

您需要实现其他 3 个表达式,根据我给您的内容,这应该是微不足道的,并且需要一个解析器来根据您的文本输入动态创建和组合表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 2014-08-24
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多