文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。
笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888
问题描述:
使用旧API编译器有诸如下面的提醒,有点编译器会报warning,有的编译器会报error,
warning: 'Reader' is deprecated: Use CharReader and CharReaderBuilder instead [-Wdeprecated-declarations]
warning: 'FastWriter' is deprecated: Use StreamWriterBuilder instead [-Wdeprecated-declarations]
问题分析:
Json::Reader 是旧版本的api,兼容性存在问题。
解决方案:
方案一 :兼容旧版本
坚持使用旧API可以在文件头部加入这段代码:
#if defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#elif defined(_MSC_VER)
#pragma warning(disable : 4996)
方案二 :使用新版本接口
// Parse config file
std::string conf_path{"./conf/test.json"};
std::ifstream cfg_file(conf_path, std::ios::binary);
if ((conf_path.empty()) || (!cfg_file.is_open())) {
printf("Open config file [%s] failed. \n");
return ;
}
std::string err;
Json::CharReaderBuilder read_builder;
Json::Value root;
if (!Json::parseFromStream(read_builder, cfg_file, &root, &err)) {
printf("Current Json file parse failed.");
return ;
}
std::string db_path = root["dbPath"].asString();
std::string main_table_name = root["mainTableName"].asString();
std::string start_timestamp = root["startTimestamp"].asString();
std::string software_version = root["softwareVersion"].asString();
std::string db_version = root["dbVersion"].asString();
// 数组
Json::Value root_value = root["subTableName"];
for (Json::Value::const_iterator iter = root_value.begin();
iter != root_value.end(); ++iter) {
std::string sub_table_name.push_back((*iter).asString());
}
// TODO ...
配置文件:
{
"dbPath": "./conf/rawdata397_2022-12-13_13-37-50.db",
"mainTableName": "SensorObstacleMsg1",
"subTableName": ["VehicleConfigMsg", "SensorObstacleMsg4", "FusedObjMsg", "PncMsg"],
"startTimestamp": "0",
"softwareVersion": "1.0.0",
"dbVersion": "1.0.0"
}