Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中运行时评估基于Json的规则_Java_Rule Engine_Mvel - Fatal编程技术网

在Java中运行时评估基于Json的规则

在Java中运行时评估基于Json的规则,java,rule-engine,mvel,Java,Rule Engine,Mvel,我需要在运行时将数据库中json格式的规则转换为Java代码 比如说, { "id": "g-KqVJwrEMUYNOEVEnNxxqc", "rules": [ { "id": "r-2VC4YQOkYu-lxkGgMABRc", "field": "firstName", "value": "Steve", "operator": "=" }, { "id": "r-B2Dd6eHO1rsZ-t1mf

我需要在运行时将数据库中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")

任何线索、想法都将受到高度赞赏

您可以在运行时使用内省来计算字段

它看起来像这样

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类。这是导语,谢谢@RohitJain,但是我正在寻找MVEL中的一些东西。我在java 8中实现了这一点,但是仍然坚持使用Integer和String类型。我需要使用一个字段“age”。知道在Java8中使用什么来代替var吗?您很可能需要使用
Object