【QT】【JSON】qt中json文件读写操作

1 JSON文件介绍

JSON
[]中标识数组
{}中标识对象
我们可以观察如下的一段Json内容。目标是将此内容读出来,并且填入到表格中,同时可以在表格中更新此部分内容的同时还会更新此文件。

[
    {
        "mode": "测试模式1",
        "module": [
            {
                "ev": "",
                "name": "",
                "wb": ""
            }
        ]
    },
    {
        "mode": "测试模式2",
        "module": [
            {
                "ev": "-21",
                "name": "模组名字1",
                "wb": "5200"
            },
            {
                "ev": "-21",
                "name": "模组名字2",
                "wb": "5200"
            }
        ]
    }
]

先观察上述Json文件的构造。
能看出要先构造好对应的外圈大数组。
数组中塞入每一个对象(用结构体记录对象)
显示如下:
在这里插入图片描述看到上图就大致了解了如何拆解这个文件的内容来进行读的操作
根据上述内容开始定义结构体

 //module
    struct module
    {
        QString mName;
        QString wb;
        QString ev;
    };
	//对象结构体
    struct mJson
    {
        QString mode;
        QVector<module> mModule;
        int moduleSize = 0;                                //用于module的个数
        int modeSize = 0;                                  //mode  的个数
        bool isNull = true;                                 //预留判空
    };
    mJson JsonTemp;                        			 //存储单个信息的结构体
    QVector<mJson > JsonTxt;                	//存储所有相关配置内容

2 读JSON文件

在读操作前先建立好一个表格
我们这边写了一个类去继承QTableView来显示表格]

myJson::myJson() : QTableView()

做好表格的初始化内容

    model = new QStandardItemModel(this);
    // 初始化tableView表头
    model->setColumnCount(4);
    model->setHeaderData(0,Qt::Horizontal,QString("mode"));		//第一列加载mode关键字内容
    model->setHeaderData(1,Qt::Horizontal,QString("name"));		//第二列加载mode关键字内容
    model->setHeaderData(2,Qt::Horizontal,QString("wb"));		//第三列加载mode关键字内容
    model->setHeaderData(3,Qt::Horizontal,QString("ev"));		//第四列加载mode关键字内容

    setModel(model);

   //设置列宽
    setColumnWidth(0,100);
    setColumnWidth(1,150);
   	...

开始读文件

//byteArr内传递JSON的数据
QJsonParseError jsonError;
QJsonDocument document = QJsonDocument::fromJson(byteArr,&jsonError);           //转化为JSON文档

if(jsonError.error!=QJsonParseError::NoError)
{
//JSON文件加载内容报错.需要提示报错信息
}
else
{
//执行解析操作
}

解析操作的详细代码如下

        if(document.isArray())
        {
            int modeNum = document.array().size();
            //循环读取json外圈大循环mode
            for(int i = 0; i <  modeNum; ++i)
            {
                QJsonObject obj = document[i].toObject();

                QStringList keys = obj.keys();
                QJsonValue value = obj.value("mode");
                JsonTemp.mode = value.toString();

                value = obj.value("module");
                int size = value.toArray().size();                     
                JsonTemp.isNull = true;                        //必须要加避免读空而误删数据
                if(value.isArray()&&size)
                {
                    JsonTemp.isNull = false;                 	 //size不为0,则设置为非空作为标记点
                    JsonTemp.moduleSize = size;             	 //mode size置位
                    JsonTemp.mModule.clear();                	 //需要提前清空缓存数据
                    for(int i = 0 ; i < size;++i)
                    {
                        QJsonObject objModule = value[i].toObject();

                        QJsonValue nameValue            =   objModule.value("name");
                        QJsonValue wbValue              =   objModule.value("wb");
                        QJsonValue ev                   =   objModule.value("ev");
                        module moduleTemp;
                        moduleTemp.mName                = nameValue.toString();
                        moduleTemp.wb                   = wbValue.toString();
                        moduleTemp.ev                   = ev.toString();
                        JsonTemp.mModule.push_back(moduleTemp);                //需要配合clear来尾插
                        dataCount++;                                                    //记录有效数据个数
                    }
                }
                JsonTxt.push_back(JsonTemp);
            }
        }

至此该文件的内容已经全部读取出来并且存放到
JsonTxt中
接下来要做的是把这些内容添加到表格中。
我写的结构体有记录有效数据个数和空的数据位置。
所以直接按照总的数据数量去填充表格即可。

        int size = JsonTxt.size();
        int cur = 0;
        int dateNum = 0;                                        //用于记录表格中的数据个数
        for(int i = 0 ; i < size ;++i)
        {
            if(JsonTxt[i].isNull)
            {
                model->setItem(i,0,new QStandardItem(JsonTxt[i].mode));
                ++cur;   //空数据的偏移用于指向当前数据的位置。
                ++dateNum;
            }
            else
            {
                while (cur < size)
                {
                    int groupSize = JsonTxt[cur].module_size;
                    for(int i = 0 ;i < groupSize;++i)
                    {
                        model->setItem(dateNum,0,new QStandardItem(JsonTxt[cur].mode));
                        model->setItem(dateNum,1,new QStandardItem(JsonTxt[cur].mModule[i].mName));
                        model->setItem(dateNum,2,new QStandardItem(JsonTxt[cur].mModule[i].wb));
                        model->setItem(dateNum,3,new QStandardItem(JsonTxt[cur].mModule[i].ev));
                        ++dateNum;
                    }
                    ++cur;
                }
            }
        }

至此此表格已经可以看到对应的表格数据了
在这里插入图片描述

3 写JSON文件

写JSON文件的本质和解析是倒过来推。
先构思好Json文件里的内容

    QJsonArray jsonArrayALL;
    QJsonObject jsonObjectALL;

    QJsonArray jsonArrayModule[JsonTxt.size()];
    QJsonObject jsonObjectModule;

    QJsonDocument jsonDoc;
    QString mode;
    QString mode_last;

    int tempModeCount = 0;
    for(int i = 0; i < row;++i)	//扫描行
    {
        for(int j = 0;j < column;++j)			//扫描列
        {
            module TabData;
            switch(j)
            {
                case 0:
                    mode = model->index(i,j).data().toString();
                    break;
                case 1:   
                    TabData.mName = model->index(i,j).data().toString();
                    jsonObjectModule.insert("name",TabData.mName);
                    break;
                case 2:  
                    TabData.wb = model->index(i,j).data().toString();
                    jsonObjectModule.insert("wb",TabData.wb);
                    break;
                case 3:  
                    TabData.ev = model->index(i,j).data().toString();
                    jsonObjectModule.insert("ev",TabData.ev);
                    break;
            }
        }
		//去重复操作
        if (mode_last.toStdString() != mode.toStdString())
        {
            ++tempModeCount;
        }

        jsonArrayModule[tempModeCount-1].push_back(jsonObjectModule);

        mode_last = mode;
    }
    int mode_size = JsonTxt.size();

    for(int i = 0;i < mode_size;++i)
    {
        mode = JsonTxt.at(i).mode;
        jsonObjectALL.insert("mode",mode);
        jsonObjectALL.insert("module",jsonArrayModule[i]);
        jsonArrayALL.push_back(jsonObjectALL);
    }

    jsonDoc.setArray(jsonArrayALL);
    QByteArray json = jsonDoc.toJson();

	//写文件
    QFile file("输出.json");
    file.open(QIODevice::WriteOnly);
    file.write(json);
    file.close();

至此Qt中的json文件读和写都完成。

猜你喜欢

转载自blog.csdn.net/qq_38753749/article/details/128885457