【问题标题】:Evaluate Json based Rule at runtime in Java在 Java 运行时评估基于 Json 的规则
【发布时间】:2020-07-11 13:37:21
【问题描述】:

我需要在运行时将数据库中 json 格式的规则转换为 Java 代码。

例如,

{
  "id": "g-KqVJwrEMUYNOEVEnNxxqc",
  "rules": [
    {
      "id": "r-2VC4YQOkYu-lxkGgMABRc",
      "field": "firstName",
      "value": "Steve",
      "operator": "="
    },
    {
      "id": "r-B2Dd6eHO1rsZ-t1mfPk33",
      "field": "lastName",
      "value": "Vai",
      "operator": "="
    }
  ],
  "combinator": "and",
  "not": false
}

json 中的键是事先知道的。字段和运算符值也将是固定的和已知的。

但我对如何将上面的内容转换为代码感到困惑,

inputObject.firstName.equals("Steve") && inputObject.lastName.equals("Vai")

非常感谢任何线索和想法!

【问题讨论】:

标签: java rule-engine mvel


【解决方案1】:

您可以使用自省在运行时评估字段

看起来像这样

Command command = parseJson(input); // transform input into a java object
InputObject o = getItFromSomewhere();    
bool finalResult;


// process each rule
for ( Rule r: command.rules ) {

   var fieldValue = o.getClass().getField(r.field).get(o);

   var currentResult;
   switch(r.operator) {
      case "=": currentResult = fieldValue.equals(r.value);
      break;
      case ">": currentResult = .... 
      ..etc
    } 

    // combine it with previous results; 
    switch(command.combinator) {
      case "and": 
         finalResult = finalResult && currentResult;
         break;
       case "or":
          finalResult = finalResult || currentResult;
     }

}
System.out.println(finalResult);

显然,这不是确切的代码,只是为了展示如何在运行时动态检索字段值并对其进行评估。

【讨论】:

  • 我为 java 8 实现了这个,但有点坚持使用整数和字符串类型。我有一个需要使用的“年龄”字段。知道在 Java 8 中用什么代替 var 吗?
  • 您很可能需要使用Object
猜你喜欢
  • 2019-09-07
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多