是否可以基于 C 或 C++ 中的 JSON 动态创建 if 语句

Is it possible to create if statement dynamically based on JSON in C or C++

本文关键字:JSON 中的 动态 创建 语句 if C++ 是否      更新时间:2023-10-16

我想知道有没有办法基于 JSON 在 C 或 C++ 中动态创建"if"语句。

例如,我有以下 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 输入,我需要使用 C 或 C++ 动态创建 if 语句。必须解析上面的 json 数据并将其视为 C 或 C++ 中的实际 if-else 语句。

任何像"ifstatement1"这样的内容都应该转换为条件检查,如果此检查为真,则必须应用"actionstatement1"中存在的值。

if语句和操作语句的数量可以动态变化。

在 C 或 C++ 中是否有任何特定的方法来动态评估 json 数据作为参数?

这就像我们以 JSON 格式给出的规则。此规则应在程序启动时存储,并将在特定时间段内使用当前值和存储值进行检查。如果任何条件匹配,则应用该条件的值。

如果有更好的方法,请分享。

因此,如果您正在考虑在C++代码中即时或在编译代码后创建if语句,答案是您无法这样做。您可以创建为您准备好if语句的解析器。请记住,C 和 C++ 是编译语言,这意味着您在代码中输入的内容会被编译为 0 和 1,当您运行它时,这些 0 和 1 会在为您加载的内存中。

你应该指定你想要达到的条件,并决定使用 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()for float。

由于你的问题太笼统了,我无法帮助你进一步:(

正如其他人从评论和用户 Gox 的回答中所说的那样; 您不能动态创建if statements动态或动态说话。

但是,在阅读您的评论或回复他人后:

这是示例条件。 然后if (condition1 == 0 && !strcmp(condition2, "down") )执行操作。 条件 1 值可以是 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:     ...                           ...

您应该能够创建某种键结构,例如使用std::multimap或类似的东西来构建表。