JSON文件信息提取及时间戳转换
对json格式的文件进行读取需要使用到第三方库json库,可在json文件读取include和src处下载。
这里以读取json格式的雷达数据为例:
新建一个VS项目,建立接收储存数据的结构体RadarInfo_t
如下:
typedef struct { int timeStamp = 0; unsigned int radar_id = -1; unsigned int car_id = -1; unsigned int road_id = -1; int miss = 0; int life = 0; Eigen::Vector2d position = { 0.0, 0.0 }; Eigen::Vector2d velocity = { 0.0, 0.0 }; }RadarInfo_t;
命名函数void LoadRadarInfo(const std::string &path, std::vector<RadarInfo_t> &radarObjects);
,参数为文件路径和数据结构体,函数内代码如下:
void LoadRadarInfo(const std::string &path, std::vector<RadarInfo_t> &radarObjects) { radarObjects.clear(); //从文件中读取 ifstream in(path, ios::binary); Json::Reader reader; Json::Value root; if (!in.is_open()) { cout << "Error opening file\n"; return; } reader.parse(in, root); //reader将Json字符串解析到root,root将包含Json里所有子元素 for (int i = 0; i < root.size(); i++) { RadarInfo_t object; Json::Value value = root[i]; //读取根节点信息 if (value["RecordTime"].isString()) { string RecordTime = value["RecordTime"].asString(); // 访问节点 //cout << "RecordTime: " << RecordTime << endl; timeb radarTime = StringToDatetime(RecordTime); //cout << "radarTime.time = " << radarTime.time << endl; //从1970年开始经过的秒数 //cout << "radarTime.millitm = " << radarTime.millitm << endl;//数据的毫秒数 object.timeStamp = radarTime.time * 1000 + radarTime.millitm; //时间戳//帧率 } //QDateTime radarTime = QDateTime::fromString(RecordTime, " yyyy-MM-ddThh:mm:ss:zzz");//提取时间戳 if (value["RadarID"].isString()) { string RadarID = value["RadarID"].asString(); //cout << "RadarID: " << RadarID << endl; object.radar_id = StringToDouble(RadarID); } if (value["Px"].isString()) { string Px = value["Px"].asString(); //cout << "Px: " << Px << endl; object.position[0] = StringToDouble(Px); } if (value["Py"].isString()) { string Py = value["Py"].asString(); //cout << "Py: " << Py << endl; object.position[1] = StringToDouble(Py); } if (value["RoadId"].isString()) { string RoadId = value["RoadId"].asString(); //cout << "RoadId: " << RoadId << endl; object.road_id = StringToInt(RoadId); } if (value["Vx"].isString()) { string Vx = value["Vx"].asString(); //cout << "Vx: " << Vx << endl; object.velocity[0] = StringToDouble(Vx); } if (value["Vy"].isString()) { string Vy = value["Vy"].asString(); //cout << "Vy: " << Vy << endl; object.velocity[1] = StringToDouble(Vy); } if (value["CarID"].isString()) { string CarID = value["CarID"].asString(); //cout << "CarID: " << CarID << endl; cout << endl; object.car_id = StringToInt(CarID); } //读取子节点信息 //string friend_name = root["friends"]["friend_name"].asString(); radarObjects.push_back(object); /*for (auto iter = radarObjects.begin(); iter != radarObjects.end();){ std::cout << "iter->car_id = " << iter->car_id << std::endl; std::cout << "iter->road_id = " << iter->road_id << std::endl; std::cout << "iter->position[0] = " << iter->position[0] <<" " //x << "iter->position[1] = " << iter->position[1] << std::endl; //y std::cout << "iter->velocity[0] = " << iter->velocity[0] <<" " //x << "iter->velocity[1] = " << iter->velocity[1] << std::endl //y << std::endl; ++iter; }*/ } in.close(); return; }
在读取RecordTime
时读进来的是字符类型的时间,需要将其转为时间戳的形式以便进行后续的处理,使用C++提供的timeb
结构体即可,代码如下:
timeb StringToDatetime(string str) { timeb time_b; tm tm_; // 定义tm结构体。 int year, month, day, hour, minute, second, millisecond;// 定义时间的各个int临时变量。 year = atoi((str.substr(0, 4)).c_str()); month = atoi((str.substr(5, 2)).c_str()); day = atoi((str.substr(8, 2)).c_str()); hour = atoi((str.substr(11, 2)).c_str()); minute = atoi((str.substr(14, 2)).c_str()); second = atoi((str.substr(17, 2)).c_str()); millisecond = atoi((str.substr(20, 3)).c_str()); tm_.tm_year = year - 1900; // 年,由于tm结构体存储的是从1900年开始的时间,所以tm_year为int临时变量减去1900。 tm_.tm_mon = month - 1; // 月,由于tm结构体的月份存储范围为0-11,所以tm_mon为int临时变量减去1。 tm_.tm_mday = day; // 日。 tm_.tm_hour = hour; // 时。 tm_.tm_min = minute; // 分。 tm_.tm_sec = second; // 秒。 tm_.tm_isdst = 0; // 非夏令时。 time_b.time = mktime(&tm_); // 将tm结构体转换成time_t格式 time_b.millitm = millisecond; return time_b; // 返回值。 }
打开void LoadRadarInfo(const std::string &path, std::vector<RadarInfo_t> &radarObjects);
中的cout
测试即可看到处理效果。
互联网学习 文章被收录于专栏
互联网知识点