Qt中JSON数据的保存与文件打开全解析:从保存到读取的完整流程
在Qt开发中,JSON作为一种轻量级的数据交换格式,常用于配置文件、数据存储与网络传输等场景,JSON数据的保存到文件及后续打开读取,是Qt开发者的必备技能,本文将以Qt的QJsonDocument为核心,详细讲解JSON数据的序列化(保存)、文件写入,以及反序列化(打开)、文件读取的完整流程,并提供代码示例与注意事项。
JSON数据保存到文件的完整步骤
将JSON数据保存到文件,本质上是将Qt中的JSON对象(QJsonObject)或JSON数组(QJsonArray)转换为文本格式,并写入文件系统的过程,核心步骤包括:构建JSON数据 → 序列化为QJsonDocument → 写入文件。
包含必要的头文件
首先需引入Qt JSON模块相关的头文件:
#include <QJsonObject> #include <QJsonDocument> #include <QFile> #include <QTextStream> #include <QDebug>
构建JSON数据
根据需求创建QJsonObject(键值对集合)或QJsonArray(值列表),保存一个用户信息对象:
QJsonObject userInfo;
userInfo.insert("name", "张三");
userInfo.insert("age", 25);
userInfo.insert("isStudent", false);
userInfo.insert("scores", QJsonArray{85, 92, 78}); // 嵌套JSON数组
将JSON对象转换为QJsonDocument
QJsonDocument是JSON数据的“容器”,提供了序列化和反序列化的接口,根据数据类型选择转换方式:
- 若数据是
QJsonObject,使用QJsonDocument::fromJson()的setObject()方法; - 若数据是
QJsonArray,使用setArray()方法。
QJsonDocument doc; doc.setObject(userInfo); // 将QJsonObject封装到QJsonDocument中
将QJsonDocument写入文件
通过QFile操作文件,使用QTextStream或write()方法写入数据,推荐使用QJsonDocument::toJson()直接输出字节数组,避免手动处理换行和转义:
方法1:直接写入字节数组(推荐)
QFile file("user_info.json");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() << "无法打开文件进行写入:" << file.errorString();
return;
}
file.write(doc.toJson()); // 将QJsonDocument转换为JSON字节数组并写入
file.close();
qDebug() << "JSON数据已保存到user_info.json";
方法2:通过QTextStream写入(可格式化输出)
若希望JSON文件格式化(缩进、换行),可使用QJsonDocument::toJson(QJsonDocument::Indented):
QFile file("user_info_formatted.json");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() << "无法打开文件:" << file.errorString();
return;
}
QTextStream out(&file);
out.setCodec("UTF-8"); // 确保UTF-8编码,避免中文乱码
out << doc.toJson(QJsonDocument::Indented); // 缩进格式化输出
file.close();
从文件打开并读取JSON数据的完整步骤
打开JSON文件并读取数据,是保存的逆过程:读取文件内容 → 转换为QJsonDocument → 解析为QJsonObject/QJsonArray。
打开文件并读取内容
使用QFile以只读模式打开文件,并通过readAll()读取全部内容(适用于小文件):
QFile file("user_info.json");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "无法打开文件进行读取:" << file.errorString();
return;
}
QByteArray jsonData = file.readAll(); // 读取文件全部内容为字节数组
file.close();
将字节数组转换为QJsonDocument
使用QJsonDocument::fromJson()将字节数组解析为QJsonDocument,并检查解析是否成功:
QJsonDocument doc = QJsonDocument::fromJson(jsonData);
if (doc.isNull()) {
qDebug() << "JSON解析失败:文件内容不是有效的JSON格式";
return;
}
从QJsonDocument中提取数据
根据保存时的数据类型(对象或数组),提取QJsonObject或QJsonArray:
场景1:提取JSON对象(保存时为setObject())
if (doc.isObject()) {
QJsonObject obj = doc.object();
QString name = obj.value("name").toString(); // 通过键获取值
int age = obj.value("age").toInt();
bool isStudent = obj.value("isStudent").toBool();
QJsonArray scores = obj.value("scores").toArray();
qDebug() << "用户信息:";
qDebug() << "姓名:" << name;
qDebug() << "年龄:" << age;
qDebug() << "是否学生:" << isStudent;
qDebug() << "成绩:" << scores;
}
场景2:提取JSON数组(保存时为setArray())
若保存的是JSON数组(如列表数据),解析方式类似:
if (doc.isArray()) {
QJsonArray arr = doc.array();
qDebug() << "数组内容:";
for (const QJsonValue &value : arr) {
if (value.isObject()) {
QJsonObject item = value.toObject();
qDebug() << "项目:" << item.value("name").toString();
}
}
}
关键注意事项与常见问题
文件编码问题
JSON文件推荐使用UTF-8编码,避免中文乱码,写入时可通过QTextStream::setCodec("UTF-8")指定编码,读取时QFile会自动处理UTF-8(若文件头含BOM,需额外处理)。
JSON格式有效性
- 键名必须用双引号()包围,单引号会导致解析失败;
- 值类型需匹配(如数字不能用引号包裹,布尔值为
true/false而非字符串); - 注意逗号的使用(对象最后一个键值对后不能有逗号)。
若解析失败,可通过在线JSON格式化工具(如JSONLint)检查文件格式。
文件操作错误处理
始终检查QFile是否成功打开(open()返回值),并处理可能的错误(如权限不足、文件不存在):
if (!file.open(QIODevice::WriteOnly)) {
qDebug() << "打开失败:" << file.errorString(); // 输出具体错误原因
}
二进制模式与文本模式
- 写入JSON时,推荐使用
QIODevice::Text模式,自动处理平台相关的换行符(Windows为\r\n,Linux为\n); - 若直接调用
write()写入字节数组,可省略Text模式,但需确保字节数组编码正确。
完整示例代码
保存JSON到文件
#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonDocument>
#include <QFile>
#include <QDebug>
void saveJsonToFile() {
// 1. 构建JSON对象
QJsonObject config;
config.insert("app_name", "数据管理系统");
config.insert("version", "1.0.0");
config.insert("debug_mode", true);
config.insert("database", QJsonObject{
{"host", "localhost"},
{"port", 3306},
{"username", "root"}
});
// 2. 封装为QJsonDocument
QJsonDocument doc;
doc.setObject(config);
// 3. 写入文件(UTF-8编码,格式化)
QFile file("config.json");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() << "保存失败:" << file.errorString();
return;
}
QTextStream out(&file);
out.setCodec("UTF-8");
out << doc.toJson(QJsonDocument::Indented); // 缩进格式
file.close();
qDebug() << "配置已保存到config.json";
}
从文件读取JSON
void loadJsonFromFile() {
QFile file("config.json");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "读取失败:" << file.errorString();
return;
}
QByteArray jsonData = file.readAll();
file.close();
// 解析JSON
QJsonDocument doc = QJsonDocument::fromJson(jsonData);
if (doc.isNull()) {
qDebug() << "JSON格式无效";
return;
}
if (doc.isObject()) {


还没有评论,来说两句吧...