简介
介绍使用Qt读写JSON文件。如果你对JSON不是很了解,请阅读我之前的一篇文章json简介。
使用的开发环境为:
Qt 5.12.0+Deepin 15.8
在Qt中与JSON相关的类有以下几个,Q=QJsonDocument,QJsonArray,QJsonObject,QJsonParseError,QJsonValue。
其中QJsonDocument类提供了读写JSON文档的方式,我们可以通过该类的方法QJsonDocument::fromJson()将一个JSON文档转换成QJsonDocument类,或者通过QJsonDocument::toJson()和QJsonDocument::toBinaryData()函数将一个QJsonDocument类转换为QByteArray,这样我们就可以很轻松地将其写入文件。
QJsonArray封装了JSON中的数组。
QJsonObject封装了JSON中的对象。
QJsonValue封装了JSON中的值。
QJsonParseError 用于报告JSON解析中的错误类型。
使用QJsonObject简单演示
首先,我们使用Qt creator创建一个Qt Console Application项目,项目名称位置可随意。
修改main.cpp中的代码如下所示
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QString>
#include <QDebug>
#include <QFile>
#include <QDateTime>
#include <QDir>
int main(int argc, char *argv[]) {
// 以读写方式打开主目录下的1.json文件,若该文件不存在则会自动创建
QFile file(QDir::homePath() + "/1.json");
if(!file.open(QIODevice::ReadWrite)) {
qDebug() << "File open error";
} else {
qDebug() <<"File open!";
}
// 使用QJsonObject对象插入键值对。
QJsonObject jsonObject;
jsonObject.insert("name", "tom");
jsonObject.insert("age", "18");
jsonObject.insert("time", QDateTime::currentDateTime().toString());
// 使用QJsonDocument设置该json对象
QJsonDocument jsonDoc;
jsonDoc.setObject(jsonObject);
// 将json以文本形式写入文件并关闭文件。
file.write(jsonDoc.toJson());
file.close();
qDebug() << "Write to file";
return 0;
}
之后打开你的终端(linux环境下), 会看到我们的程序在主目录下生成了一个1.json的文件。然后查看下里面的内容。
不知道你有没有注意到,我们在jsonObject中插入键值对的顺序和文件中的键值对顺序不太一样,这是因为JSON中的object本身是指无序的键值对,它不能确保我们插入的顺序和实际保存的数据顺序一致。如果你的数据需要顺序一致,考虑JSON中的array,array是值的有序列表。
简单使用QJsonArray
修改main.cpp中的代码如下,注:该代码会清空主目录先1.json的原有内容,如果你想保留原有的文件内容,请备份或者修改写入的文件名。
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QString>
#include <QDebug>
#include <QFile>
#include <QDateTime>
#include <QDir>
int main(int argc, char *argv[]) {
// 以读写方式打开主目录下的1.json文件,若该文件不存在则会自动创建
QFile file(QDir::homePath() + "/1.json");
if(!file.open(QIODevice::ReadWrite)) {
qDebug() << "File open error";
} else {
qDebug() <<"File open!";
}
// 清空文件中的原有内容
file.resize(0);
// 使用QJsonArray添加值,并写入文件
QJsonArray jsonArray;
jsonArray.append("name");
jsonArray.append(18);
jsonArray.append(QDateTime::currentDateTime().toString());
QJsonDocument jsonDoc;
jsonDoc.setArray(jsonArray);
file.write(jsonDoc.toJson());
file.close();
qDebug() << "Write to file";
return 0;
}
这次文件中的数据顺序,和我们扩展JSON数组中的顺序是一致的。
稍微复杂的例子
我们注意到JSON中的值可以是字符串、数组、对象、数字等,因此我们试试结合使用一下。
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QString>
#include <QDebug>
#include <QFile>
#include <QDateTime>
#include <QDir>
#include <QThread>
int main(int argc, char *argv[]) {
// 以读写方式打开主目录下的1.json文件,若该文件不存在则会自动创建
QFile file(QDir::homePath() + "/1.json");
if(!file.open(QIODevice::ReadWrite)) {
qDebug() << "File open error";
} else {
qDebug() <<"File open!";
}
// 清空文件中的原有内容
file.resize(0);
// 使用QJsonArray添加值,并写入文件
QJsonArray jsonArray;
for(int i = 0; i < 3; i++) {
QJsonObject jsonObject;
jsonObject.insert("name", QString::number(i+1));
jsonObject.insert("age", i+18);
jsonObject.insert("time", QDateTime::currentDateTime().toString());
jsonArray.append(jsonObject);
QThread::sleep(2);
}
QJsonObject jsonObject;
jsonObject.insert("number", jsonArray.size());
jsonArray.append(jsonObject);
QJsonDocument jsonDoc;
jsonDoc.setArray(jsonArray);
file.write(jsonDoc.toJson());
file.close();
qDebug() << "Write to file";
return 0;
}
结果如下所示