读写json文件

文本中读取数据,将文本读入内存生成字符串然后将字符串解析成结构化数据。

结构数据存入文本,将结构数据序列化成字符串,然后将字符串存入文本。

 

字符串的读写,可以用c++的通用的 iostream 标准的流读入读出工具就可以。

至于字符串的解析和序列化,会有多种选择,最基本的用c/c++ 字符串分析工具,比如string自带的成员函数,当然也可以用其他比较流行的库比如 xml、json、protobuf 。等

 

最近要用到json解析文件,作为总结写了一个读写json文件的例子。采用的库位json11,需要c++11支持。json11的下载地址: https://github.com/dropbox/json11 。

使用时只需将json11.hpp 和 json11.cpp 添加到工程目录下。

 

具体json11.hpp定义的数据结构可以参考另外一篇博客:https://blog.csdn.net/fengbingchun/article/details/51396932

 

 

下面贴出了具体的从文本读取json数据,并且将json数据存如文本的过程。

 

 

#include <iostream>

#include "json11.hpp"

#include <vector>

#include <string.h>

#include <fstream>

using namespace std;

 

 

//单个车位包含的信息

class SlotInf

{

public:

    int park_id;        //车位编号 >0 为有效车位

    float loc_points[8];  //存储车辆坐标系下的车位顶点坐标[x1,y1,x2,y3,....]

    int img_points[8];    //图像从坐标系下车位顶点坐标

    int datalen;        //字段长度

 

public:

    SlotInf(int park_id_, json11::Json::array locpoints, json11::Json::array imgpoint)

    {

        datalen=8;

        memset(loc_points,0,sizeof(loc_points));

        memset(img_points,0,sizeof(img_points));

 

        //读入park_id_

        park_id = park_id_;

        if (park_id_ == 0)

        {

            return ;

        }

 

        //读入车辆坐标系顶点坐标

        int nsize = locpoints.size();

        if (nsize != datalen)

        {

            park_id=0;

            return ;

        }

        nsize = imgpoint.size();

        if (nsize != datalen)

        {

            park_id=0;

            return ;

        }

 

        for(int i=0; i<nsize; i++)

        {

            loc_points[i] = locpoints[i].number_value();

            img_points[i] = imgpoint[i].number_value();

 

            //cout<<loc_points[i]<<"  "<<img_points[i]<<endl;

        }

    }

 

    ~SlotInf()

    {

        //delete[] loc_points;

        //delete[] img_points;

    }

};

 

bool readJson(string file_dir, vector<SlotInf> &slotVect)

{

    //文件中读取数据流并存储到string中

    std::filebuf in;

    if(!in.open(file_dir.c_str(),std::ios::in))

    {

        cout<<"fail to open file!"<<endl;

        return false;

    }

 

    std::istream iss(&in);

    std::istreambuf_iterator<char> eos;

    string s(std::istreambuf_iterator<char>(iss),eos); //将数据流填充到s变量中

    string err;

    in.close();

 

    //从string中解析文件结构

    //json11::Json json = json11::Json::parse(s, err);

    auto json = json11::Json::parse(s, err);

    if(!err.empty())

    {

        return false;

    }

 

    slotVect.clear();

    std::string json_str = json.dump();              //将json文件顺序写入string中

 

    json11::Json::array array1 = json.array_items(); //数据结构的最外层是队列,每个元素对应一个车位的信息

 

    for (int i =0; i<array1.size(); i++)

    {

        json11::Json::object tmp = array1[i].object_items();

        SlotInf slotinf(tmp["park_id"].int_value(),tmp["loc_points"].array_items(),tmp["img_point"].array_items());

        slotVect.push_back(slotinf);

 

        //获取车位id

       /* int park_id = tmp["park_id"].int_value();

        cout<<park_id<<endl;

 

        //获取车位坐标

        json11::Json::array locpoints = tmp["loc_points"].array_items();

        vector<float> loc_pointsvect;

        for (int j =0; j<locpoints.size(); j++)

        {

            loc_pointsvect.push_back(locpoints[j].number_value());

        }

 

        //获取图像坐标

        json11::Json::array imgpoint = tmp["img_point"].array_items();

        vector<int> img_pointvect;

 

        for(int j =0; j<imgpoint.size(); j++)

        {

            img_pointvect.push_back(imgpoint[j].number_value());

        }

       */

    }

    return  true;

}

 

//将读取的json文件重新存储为.json 文件

bool writjson(string savedir, vector<SlotInf> slotVect)

{

    //序列化数据

    int nsize =slotVect.size();

    json11::Json::array slots; //存放车辆信息的数组

    for(int i=0; i<nsize; i++)

    {//读取每个车位的信息

        json11::Json::array loc_points;

        json11::Json::array img_points;

        for(int j=0; j<slotVect[i].datalen; j++)

        {

            loc_points.push_back(slotVect[i].loc_points[j]);

            img_points.push_back(slotVect[i].img_points[j]);

        }

        json11::Json tmp_json = json11::Json::object{

                {"park_id",slotVect[i].park_id},

                {"loc_points",loc_points},

                {"img_points",img_points}

        };

        slots.push_back(tmp_json);

 

    }

    string json_str = json11::Json(slots).dump();

 

 

    //保存到文本

    ofstream oswirte(savedir);

    oswirte<<json_str<<endl;

    oswirte.close();

    return true;

 

}

 

int main() {

 

 

    vector<SlotInf> slotVect;

    readJson("/home/CLionProjects/jsonrw/2.json", slotVect);

    writjson("/home/CLionProjects/jsonrw/3.json", slotVect);

 

     return 0;

}

 

json文本的内容:

[{"park_id": 1, "loc_points": [10.124499486113775, -3.3475110446685226, 7.334836432931803, -3.224959302712459, 7.099517093580167, -8.581567509259186, 9.88918014676214, -8.70411925121525], "img_point": [723, 431, 846, 490, 1340, 493, 1152, 447]}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}]

 

参考博客:https://blog.csdn.net/fengbingchun/article/details/51396932

https://blog.csdn.net/zhouzhenhe2008/article/details/77840731

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值