得知没有这样的事情可以完全按照您的意愿去做,您应该不会感到惊讶。你必须自己写。
有两个主要步骤:解析器和解释器。构建此代码的逻辑方法是使用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 && bar = baz 建模,您可以像这样将这两个类组合在一起:
Expression fullExpression = new AndExpression(
new EqualsExpression("foo", "bar"),
new EqualsExpression("bar", "baz")
);
您需要实现其他 3 个表达式,根据我给您的内容,这应该是微不足道的,并且需要一个解析器来根据您的文本输入动态创建和组合表达式。