- JSON文件的解析
[]中括号代表的是一个数组;
{}大括号代表的是一个对象;
双引号“ ”表示的是属性值;
冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可 以是基本数据类型,也可以是引用数据类型。
- 打开文件
- 解析出一个QJsonObject对象
- 利用这个对象进行嵌套解析取出变量
头文件
QStack<QTreeWidgetItem*> stack;
private:
QTreeWidget *treeWidget;
QTreeWidgetItem *treeWidgetItem_Block;
QTreeWidgetItem *treeWidgetItem_Product;
QString blockalia_Block;
QString blockalia_Product;
treeWidget=new QTreeWidget(this);
//读出文件相对路径
//相对路径就是exe目录下去找到文件的位置
//Qt获取exe文件目录的方法(QCoreAPPlication::application())
QString json_file_path("");
//根据路径获取文件的内容
QFile json_file(json_file_path);
json_file.open(QIODevice::ReadOnly);
if(!json_file.isOpen())
{
qInfo()<<"Open File error!";
}
QTextCodec* text_code=QTextCodec::codecForName("UTF-8");
QString raw_json=json_file.readAll();
QJsonParseError parse_error;
//解析出一个json文件对象
QJsonObject block_json=QJsonDocument::fromJson(raw_json.toUtf8(),&parse_error).object();
//通过这个JSON文件取出其他数据
//数组类型的
QJsonArray pagesArray_=block_json["pages"].toArray();
for(int i=0;i<pagesArray_.size();i++){
QJsonValue page=pagesArray_.at(i);
//将page转变为QJsonObject,可以进一步从中取出对象
QJsonObject pages_Obj=page.toObject();
//在将pages转变为QJsonObject类型之后可以嵌套循环遍历出自己想要拿到的数据
QJsonArray graphArray_=pages_Obj["graphObjects"].toArray();
for(int j=0;j<graphArray_.size();j++){
//接着进行解析直到取出想要的数据
QJsonValue grapObject_=graphArray_.at(j);
QJsonObject graph_Obj=grapObject_.toObject();
QString what=graph_Obj["what"].toString();
//父节点的遍历
//再次递归是就是父节点下子节点的遍历
QString blockalia_Block=graph_Obj["blockalias"].toString();
if(what=="Block"){
if(!stack.empty()){
treeWidgetItem_Block=stack.top();
treeWidgetItem_Product=new QTreeWidgetItem(treeWidgetItem_Block);
treeWidgetItem_Product->setText(0,blockalia_Block);
}
//satck现在是空的 所以将blockalia_Block赋值到父节点上
//serialzationjson(filePath,fileName)之后 stack里面有值了进行if的操作
//就是把子节点赋值到树上去
else {
treeWidgetItem_Block=new QTreeWidgetItem(treeWidget);
treeWidgetItem_Block->setText(0,blockalia_Block);
}
}
else if(what=="Product"){
blockalia_Product=graph_Obj["blockalias"].toString();
qInfo()<<"blockalia_Product"<<blockalia_Product;
QString filePath=graph_Obj["filePath"].toString();
QString fileName=graph_Obj["fileName"].toString();
if(!stack.empty()){
treeWidgetItem_Block=stack.top();
treeWidgetItem_Product=new QTreeWidgetItem(treeWidgetItem_Block);
treeWidgetItem_Product->setText(0,blockalia_Block);
stack.push(treeWidgetItem_Product);
}
else {
treeWidgetItem_Block=new QTreeWidgetItem(treeWidget);
treeWidgetItem_Block->setText(0,blockalia_Block);
stack.push(treeWidgetItem_Block);
}
serialzationjson(filePath,fileName);
//一个父节点的所有子节点全部赋值完之后就可以弹出
//这样就可以一个一个父节点进行遍历赋值
stack.pop();
}
}
}
//递归
//将上述步骤定义一个函数serialzationjson(filePath,fileName)
//根据函数传入的path和name 再一次进行以上的操作
//可以循环去遍历出需要的节点