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

互联网学习 文章被收录于专栏

互联网知识点

全部评论
学到了感谢分享
点赞 回复 分享
发布于 2022-08-12 19:50

相关推荐

评论
1
2
分享

创作者周榜

更多
牛客网
牛客企业服务