Можно ли создать, если заявление динамически на основе JSON в C или C ++ - PullRequest
0 голосов
/ 18 декабря 2018

Я хотел бы знать, существует ли какой-либо подход к динамическому созданию операторов if в C или C ++ на основе JSON.

Например, у меня есть следующий ввод JSON

Rule1
    {
      "ifstatement1": {
        "condition1": 0,
        "condition2": "down"
      },
      "actionstatement1": {
        "val1": 235959,
        "val2": "yes",
        "val3": 5,
        "val4": 0,
        "val5": "increse",
        "val6": 1
      }
    }

Rule2
    {
      "ifstatement2": {
        "condition1": 2,
        "condition2": "up",
        "condition3": 10
      },
      "actionstatement2": {
        "val1": 1223,
        "val2": "no",
        "val3": 5
      }
    }

Исходя из вышеуказанного ввода JSON, мне нужно создать if-выражения динамически с использованием C или C ++.Необходимо проанализировать данные json и обработать их как фактические операторы if-else в C или C ++.

независимо от того, что происходит как "ifstatement1", должно быть преобразовано в проверку условий, если эта проверка истинна, тогда необходимо применить значенияприсутствует в "Actionstatement1".

Количество выражений if и операторов действия может изменяться динамически.

Существует ли какой-либо особый подход в C или C ++ для динамической оценки данных json как параметров?

Это похоже наПравила, которые мы даем в формате JSON.Эти правила должны быть сохранены при запуске программы, и в определенный период времени они будут проверены с текущими значениями и сохраненными значениями.если какое-либо условие соответствует, тогда примените значения этого условия.

Пожалуйста, поделитесь, если какой-либо лучший подход доступен.

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Как сказали другие из комментариев и ответа пользователя Gox ;вы не можете динамически создавать if statements на лету или динамически разговаривать.

Однако после прочтения вашего комментария или ответа на другой:

Это примерные условия.if (condition1 == 0 && !strcmp(condition2, "down") ) затем выполните действие.значения condition1 могут быть 0,1,2 ... и в зависимости от этих значений действия будут различаться.

Это дает мне немного больше информации о том, чего вы пытаетесь достичь.Как уже говорили другие, вам, вероятно, придется написать синтаксический анализатор, чтобы подготовить для вас if statements, но если вы берете свой вклад из JSON и создаете дерево отношений, например:

Initial Condition:   Determining Condition:        Action To Perform:  
condition1 == 0:     !strcmp(condition2, "down")   perform desired action
condition1 == 0:     next condition                perform desired action
...
condition1 == 1:     ...                           ...
...
condition1 == 2:     ...                           ...

Youдолжна быть в состоянии создать какую-то ключевую структуру, например, использовать std::multimap или что-то подобное для построения вашей таблицы.

0 голосов
/ 18 декабря 2018

Вы должны указать условие, которое вы хотите выполнить, а также принять решение об использовании C или C ++, в противном случае ваш вопрос слишком общий.

Также ваш вопрос не выглядит как правильный JSON: что такое Rule1? Это ключ?Тогда это должно быть что-то вроде {"Rule1" :{...}}, а внутренняя структура должна быть такой же, например "ifstatement" вместо "ifstatement1" и "ifstatement2", "actionstatemen" вместо "actionstatement1" "actionstatement2"

Я будупредположим, что ваш JSON, который не является JOSN для того, как вы разместили, имеет форму:

[
    {
      "id" : "Rule1",
      "ifstatement": {
          "condition1": 0,
          "condition2": "down"
      },
      "actionstatement": {
        "val1": 235959,
        "val2": "yes",
        "val3": 5,
        "val4": 0,
        "val5": "increse",
        "val6": 1

    },
    {
      "id": "Rule2",
      "ifstatement": {
        "condition1": 2,
        "condition2": "up",
        "condition3": 10
      },
      "actionstatement": {
        "val1": 1223,
        "val2": "no",
        "val3": 5
      }
    }
]

Существуют разные библиотеки, которые позволяют это в C ++.Одним из них является JSONcpp (я скачал исходный код, но, возможно, если вы работаете в Unix / Linux, вы можете установить двоичную версию.

Код, который я использовал для его чтенияэто что-то вроде:

Json::Value root;
std::string dataFileName = "yourPath/filename.json"
if( access( dataFileName.c_str(), F_OK ) != -1 )
{
  std::ifstream file(dataFileName);
  file >> root;// file exists

  for (Json::Value::ArrayIndex i = 0; i != root.size(); i++)
  {
    for (Json::Value::ArrayIndex j = 0; j != root[i]["ifstatement"].size(); j++)
    {

      (root[i]["ifstatement"][j] );
      ...
    }

  }
}

Таким образом, в основном root представляет весь ваш файл, а тип Json::Value::ArrayIndex j позволяет перебирать ваш JSON-файл, который, как я переписал, его самая внешняя структура - это массив.Затем вы можете получить доступ к полям как: root[0] эквивалентно вашему исходному правилу RUle1, а затем указать ключ: например, root[0]["ifstatement"]. Если вам нужно преобразовать значение в целое число из файла JSON, вам следует использовать метод asInt() илиasFloat() для float.

Поскольку ваш вопрос слишком общий, я не могу помочь вам в дальнейшем: (

0 голосов
/ 18 декабря 2018

Итак, если вы думаете о создании оператора if внутри вашего кода C++ на лету или после того, как вы скомпилировали код, ответ - вы не можете этого сделать.Вы можете создать парсер, у которого будет готов оператор if.Помните, что C и C ++ - это скомпилированные языки, то есть то, что вы помещаете в код, оно компилируется в 0 и 1, и когда вы запускаете его, эти 0 и 1 загружаются в память для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...