Qt中如何将多个QJsonObject追加到同一QJsonArray生成JSON文件
解决QJsonArray多次写入生成多个独立数组的问题
我明白你的问题所在了——每次调用insertDefect时,你都创建了一个全新的QJsonArray,然后直接把整个数组追加到文件末尾,这就导致最终的JSON文件里出现了多个独立的数组,既不符合JSON规范,也达不到你想要的“单个数组包含所有缺陷对象”的目标。
问题根源分析
当前代码的核心问题:
- 使用
QIODevice::Append模式打开文件,每次都会在现有内容后面追加新数据 - 每次都创建新的
QJsonArray,只添加当前的缺陷对象,然后把整个数组写入文件 - 最终文件里会出现多个
[ ... ]结构,这是无效的JSON格式
解决方案:读取现有数组再追加新对象
正确的做法应该是:每次保存时先读取文件中已有的JSON数组(如果文件存在且有内容),将新的缺陷对象添加到这个数组中,然后覆盖写入整个文件,而不是追加。
修改后的代码如下:
void List::insertDefect(const QString &parentDefect, const QString &defect, const QString &positions) const { QString filename = createListDefect(); QFile file(filename); QJsonArray listArray; // 1. 如果文件存在且不为空,读取现有的JSON数组 if (file.exists() && file.size() > 0) { if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QByteArray jsonData = file.readAll(); QJsonDocument doc = QJsonDocument::fromJson(jsonData); if (doc.isArray()) { listArray = doc.array(); } file.close(); } } // 2. 创建新的缺陷对象并添加到数组 QJsonObject defectObject; defectObject.insert("parentDefect", QJsonValue::fromVariant(parentDefect)); defectObject.insert("defect", QJsonValue::fromVariant(defect)); defectObject.insert("positions", QJsonValue::fromVariant(positions)); listArray.push_back(defectObject); // 3. 将更新后的数组写入文件(覆盖模式) if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QJsonDocument doc(listArray); file.write(doc.toJson(QJsonDocument::Indented)); file.close(); } }
关键修改点说明
- 打开模式变化:不再使用
Append,而是先以ReadOnly读取现有内容,再以WriteOnly覆盖写入整个文件 - 读取现有数组:每次保存前先检查文件是否有内容,如果有就解析出已有的
QJsonArray,确保新对象是添加到已有数组中 - 覆盖写入:最后将包含所有对象的完整数组写入文件,保证文件始终是一个有效的JSON数组
验证结果
现在每次点击保存按钮,新的缺陷对象都会被添加到同一个数组中,最终生成的JSON文件格式会和你期望的一致:
[ { "defect": "MISSING, DAMAGED", "parentDefect": "SEAT BELTS", "positions": "F | RB | " }, { "defect": "RIGIDITY,CORROSION,DISTORTION", "parentDefect": "CHASSIS OR SUB-FRAME", "positions": "B | RC | RB | " } ]
内容的提问来源于stack exchange,提问作者user user
相关产品推荐
相关产品推荐

