Qt中如何高效修改JSON文件:从基础到实践
在Qt开发中,JSON文件因其轻量级、易读性和广泛支持,常用于配置存储、数据交换等场景,如何在Qt中修改JSON文件,是开发者必备的技能,本文将结合Qt提供的QJsonDocument、QJsonObject、QJsonArray等核心类,从基础操作到实战案例,详细讲解修改JSON文件的完整流程。
Qt处理JSON的核心类简介
Qt提供了QtJson模块用于JSON数据的解析与生成,核心类包括:
- QJsonDocument:表示整个JSON文档,可封装JSON对象(
QJsonObject)或JSON数组(QJsonArray),并提供与文本/二进制数据的转换方法。 - QJsonObject:键值对集合,类似C++中的
map<QString, QJsonValue>,用于表示JSON中的"{}"结构。 - QJsonArray:值列表,类似C++中的
QList<QJsonValue>,用于表示JSON中的"[]"结构。 - QJsonValue:JSON值的通用类,可存储字符串、数字、布尔值、对象、数组或null。
- QJsonParseError:用于解析JSON时返回错误信息。
这些类位于QtJson模块,需在.pro文件中添加QT += core json。
修改JSON文件的完整步骤
修改JSON文件的核心流程可概括为:读取文件→解析为JSON对象→修改数据→重新生成文本→写入文件,以下是分步详解:
步骤1:读取JSON文件内容
通过QFile读取JSON文件的文本内容,注意处理文件打开失败的情况:
#include <QFile>
#include <QTextStream>
QString readJsonFile(const QString &filePath) {
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qWarning() << "无法打开文件:" << filePath << file.errorString();
return QString();
}
QTextStream in(&file);
QString jsonContent = in.readAll();
file.close();
return jsonContent;
}
步骤2:将文本解析为QJsonDocument
使用QJsonDocument::fromJson()将读取的文本转换为QJsonDocument,并通过QJsonParseError检查解析是否成功:
#include <QJsonDocument>
#include <QJsonParseError>
QJsonDocument parseJsonDocument(const QString &jsonContent) {
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(jsonContent.toUtf8(), &error);
if (error.error != QJsonParseError::NoError) {
qWarning() << "JSON解析失败:" << error.errorString();
return QJsonDocument();
}
return doc;
}
解析后,需判断文档类型(对象或数组),后续操作基于类型展开,若JSON文件是对象格式({"key": "value"}),可通过doc.object()获取QJsonObject;若是数组格式([{"key": "value"}]}),则通过doc.array()获取QJsonArray。
步骤3:修改JSON数据(核心操作)
根据需求,通过QJsonObject或QJsonArray的接口修改数据,以下是常见修改场景:
场景1:修改/添加JSON对象的键值
假设当前JSON对象为obj,可通过insert()或operator[]修改或添加键值:
QJsonObject obj = doc.object(); // 从QJsonDocument获取对象
// 修改已有键值(若键不存在,则添加)
obj["name"] = "张三"; // 字符串值
obj["age"] = 25; // 整数值
obj["isStudent"] = QJsonValue(false); // 布尔值
// 添加嵌套对象
QJsonObject addressObj;
addressObj["city"] = "北京";
addressObj["street"] = "中关村大街1号";
obj["address"] = addressObj;
// 添加数组
QJsonArray hobbies;
hobbies.append("编程");
hobbies.append("阅读");
obj["hobbies"] = hobbies;
场景2:修改JSON数组中的元素
若JSON文档是数组(doc.isArray()),需先获取QJsonArray,再修改指定索引的元素:
QJsonArray array = doc.array();
// 修改索引1处的对象
if (array.size() > 1 && array[1].isObject()) {
QJsonObject item = array[1].toObject();
item["price"] = 99.99; // 修改数值
array[1] = item; // 替换原元素
}
// 在数组末尾添加新元素
QJsonObject newItem;
newItem["id"] = 3;
newItem["name"] = "产品C";
array.append(newItem);
场景3:删除键或数组元素
- 删除JSON对象的键:
obj.remove("keyToDelete"); - 删除JSON数组的指定索引元素:
array.removeAt(2);
歺骤4:将修改后的数据写回文件
修改完成后,需将QJsonDocument重新转换为JSON文本,并通过QFile写回原文件,注意:
- 写入前需清空文件内容(
QIODevice::Truncate),避免残留旧数据; - 使用
QJsonDocument::toJson()生成紧凑格式的JSON文本(默认无缩进),或QJsonDocument::Indented生成格式化文本(便于调试)。
#include <QJsonDocument>
bool writeJsonFile(const QString &filePath, const QJsonDocument &doc) {
QFile file(filePath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) {
qWarning() << "无法写入文件:" << filePath << file.errorString();
return false;
}
// 生成格式化的JSON文本(缩进4个空格)
QByteArray jsonData = doc.toJson(QJsonDocument::Indented);
QTextStream out(&file);
out << jsonData;
file.close();
return true;
}
完整实战案例:修改用户配置文件
假设有一个config.json如下:
{
"username": "admin",
"settings": {
"theme": "dark",
"fontSize": 14
},
"recentFiles": ["report.docx", "data.xlsx"]
}
需求:修改用户名为"user123",将字体大小设为16,添加最近打开文件"notes.txt",并删除"theme"配置,以下是完整代码:
#include <QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonParseError>
bool modifyConfigFile() {
// 1. 读取文件
QString filePath = "config.json";
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qWarning() << "无法打开配置文件:" << filePath;
return false;
}
QString jsonContent = QTextStream(&file).readAll();
file.close();
// 2. 解析JSON
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(jsonContent.toUtf8(), &error);
if (error.error != QJsonParseError::NoError) {
qWarning() << "JSON解析失败:" << error.errorString();
return false;
}
if (!doc.isObject()) {
qWarning() << "JSON文档不是对象格式";
return false;
}
// 3. 修改数据
QJsonObject obj = doc.object();
// 修改username和fontSize
obj["username"] = "user123";
QJsonObject settings = obj["settings"].toObject();
settings["fontSize"] = 16;
obj["settings"] = settings;
// 添加recentFiles元素
QJsonArray recentFiles = obj["recentFiles"].toArray();
recentFiles.append("notes.txt");
obj["recentFiles"] = recentFiles;
// 删除theme
settings.remove("theme");
// 4. 写回文件
doc setObject(obj);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) {
qWarning() << "无法写入配置文件:" << filePath;
return false;
}
file.write(doc.toJson(QJsonDocument::Indented));
file.close();
qDebug() << "配置文件修改成功!";
return true;
}
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
if (modifyConfigFile()) {
qDebug() << "操作完成";
} else {
qDebug() << "操作失败";
}
return a.exec();
}
执行后,config.json内容更新为:
{
"username": "user123",
"settings": {
"fontSize": 16
},
"recentFiles


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