wrdoct

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

对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测试即可看到处理效果。

posted on 2022-07-03 20:28  wrdoct  阅读(346)  评论(0)    收藏  举报