Оценить Json Правило на основе во время выполнения в Java - PullRequest
0 голосов
/ 31 марта 2020

У меня есть требование для преобразования правил, представленных в формате 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")

Любые выводы, мысли очень оценили!

1 Ответ

1 голос
/ 31 марта 2020

Вы можете использовать самоанализ для оценки полей во время выполнения

Это будет выглядеть примерно так

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

Очевидно, что это не точный код, а просто чтобы показать, как динамически получить поле значение во время выполнения и оценить его.

...