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 mModule;
int moduleSize = 0; //用于module的个数
int modeSize = 0; //mode 的个数
bool isNull = true; //预留判空
};
mJson JsonTemp; //存储单个信息的结构体
QVector JsonTxt; //存储所有相关配置内容
在读操作前先建立好一个表格
我们这边写了一个类去继承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;
}
}
}
写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文件读和写都完成。