读取文件
#include<QFile>
QString filename(“3.json”);
打开文件
先判定文件是否存在,在打开文件(是否正确打开)
if (!filename.exists()) {
qDebug() << "file doesnt exist";
return -1;
}
if (!filename.open(QIODevice::ReadOnly)) {
qDebug() << "some error when read the file" << endl;
return -1;
}
读取文件到QByteArray中
QByteArray allData = file.readAll();
关闭文件
file.close();
解析json字符串
需要包含头文件
#include <QJsonParseError>
#include <QJsonDocument>
#include <QJsonObject>
生成QJsonDocument对象:
QJsonParseError parseJsonErr;
QJsonDocument jsonDoc = QJsonDocument::fromJson(allData,&parseJsonErr);
是否解析错误:
if (!(parseJsonErr.error == QJsonParseError::NoError)){
qDebug() << QString::fromLocal8Bit("解析json文件错误!");
return -1;
}
转成QJsonObject对象:
QJsonObject res=jsonDoc.object();
解析的json文件中若有数组,则添加头文件:
#include <QJsonArray>
从这个Qjson对象中取值的方式可以通过operator["对应的键"]
或者成员函数QJsonObject::value("对应的键")
的方式。
而得到的值是QJsonValue类型的。这个类有toString(),toArray()等方法来转换值。
例如,这样的json文件:
{
"color": [
100,
255,
0,
100
],
"label": "mouth",
"points": [
[
0.41333332657814026,
0.5742856860160828
],
[
0.6266666650772095,
0.5714285969734192
],
[
0.6266666650772095,
0.5714285969734192
],
[
0.4346666634082794,
0.5961904525756836
],
[
0.40933331847190857,
0.5742856860160828
]
],
"type": "Polygons"
}
可以通过foreach的方式对QJson对象进行遍历:
for each (auto var in res){
qDebug()<<var;
}
结果:(上面删了一些点)
https://blog.csdn.net/dengjin20104042056/article/details/102729044
这一篇是关于QJsonValue类和其成员方法的一些介绍
具体的解析方式:
for each (auto val in res){
qDebug()<<val;
if (val.isArray()) {
QJsonArray array = val.toArray();
for (int i = 0; i < array.size(); i++) {
QJsonValue sonArray = array.at(i);
if (sonArray.isArray()) {// 对于points 二维数组的数组
qDebug() << "points:";
QJsonArray grandsonArry = sonArray.toArray(); //二维数组,size()获取数组元素个数
for (int j = 0; j < grandsonArry.size(); j++) {
double str = grandsonArry.at(j).toDouble();
qDebug() << str;
}
}
else {// 对于color
qDebug() << "color:";
qDebug() << sonArray;
}
//qDebug() << sonArray;
}
}
}
用了toDouble()方法将QJsonValue转成double,用toArray()转成QJsonArray。
另外还有判断的成员函数:isArray()、isDouble()等等。
结果:
刚才说的转换方法:
小结
总结下具体步骤:(QJsonValue可以通过函数QJsonValue::toObject()转换为QJsonObject对象)
-
先用QFile类打开*.json文件并读出所有内容到QByteArray中,用到函数
QFile::open(QIODevice::ReadOnly)
和QByteArray QFile::readAll()
; -
用读出的内容初始化
QJsonDocument
类,用到函数QJsonDocument::fromJson();
-
用
QJsonDocument
类的成员函数QJsonDocument::object()
得到为一个具体的对象QJsonObject
。 -
通过对对象
QJsonObject
进行操作,可以直接获取第一级的一对:键-值。获取的值类型为QJsonValue
类型,它包含判断值类型和转换值类型的成员函数。比如QJsonObject jsonObject;
QJsonvalue keyValue = jsonObject["name"];// 或者jsonObject.value("name")
其中,keyValue的值就是json文件下对应的value值。可以通过成员函数toString()、toDouble()、toInt()
等来转换值类型。
- 当对象
QJsonObject
里面是一组数组(即有符号[ ])时,需要将获取的对应键的值,转化为json数组QJsonArray
,可以直接用函数QJsonObject.value()
或者函数QJsonObject.take()
来获取对应键的值。
QJsonValue arrayValue = jsonObject.value(QStringLiteral("recoveryPrimaryNode"));
获取对应键的值后将其复制给json数组QJsonArray
,然后用函数QJsonArray::at(i)
来获取该数组下的第i个元素,可以用循环for(int i=0;i<array.size();i++)
来该数组。
当获取某个键对应的值后,可以通过函数QJsonValue::toObject()
将该值转换为对象,然后对象就可以像一级键-值来获取对应键的值。