Qt中更新QJsonArray数值后回写JSON文件不生效问题求助
问题原因及修复方案
核心错误点
- 键名拼写错误:代码中修改根对象时用的键是
$value,但你JSON结构里的数组键是$values,少了末尾的s,导致修改后的数组从未被写入根对象,最终写回文件的还是原始数据。 - 数组修改逻辑冗余:先删除旧对象再追加新对象的操作会打乱原数组的条目顺序,且多了不必要的遍历开销。
- 缺少错误校验:文件打开、JSON解析等操作都没有做成功判断,出现异常时无法定位问题。
- QJson对象是值拷贝:
toObject()返回的是原对象的副本,直接修改副本不会自动同步到原数组中,需要手动把修改后的对象写回数组对应位置。
修正后的代码
void updateWheelbase(const int& id) { double updatedWheelbase = dialog.wheelbaseInput().toDouble(); QFile file("替换为你的实际JSON文件路径"); // 注意替换为真实路径 // 读文件加错误判断 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "文件打开失败:" << file.errorString(); return; } QByteArray jsonData = file.readAll(); file.close(); QJsonParseError parseError; QJsonDocument itemDoc = QJsonDocument::fromJson(jsonData, &parseError); if (parseError.error != QJsonParseError::NoError) { qDebug() << "JSON解析失败:" << parseError.errorString(); return; } QJsonObject rootObject = itemDoc.object(); QJsonArray valuesArray = rootObject.value("$values").toArray(); // 单次遍历直接修改对应条目 for (int i = 0; i < valuesArray.size(); i++) { QJsonObject obj = valuesArray[i].toObject(); if (obj.value("chassicId").toInt() == id) { obj["wheelbase"] = updatedWheelbase; valuesArray.replace(i, obj); // 修改后写回数组 break; } } // 正确赋值键名$values rootObject["$values"] = valuesArray; itemDoc.setObject(rootObject); // 写文件加错误判断 if (!file.open(QFile::WriteOnly | QFile::Text | QFile::Truncate)) { qDebug() << "文件写入打开失败:" << file.errorString(); return; } file.write(itemDoc.toJson()); file.close(); }
额外注意事项
- 代码中
"json file path"占位符需要替换为你实际的JSON文件绝对路径,避免相对路径找不到文件的问题。 - 可输出调试日志确认匹配到的id、修改后的wheelbase值是否符合预期,进一步排查逻辑问题。
内容的提问来源于stack exchange,提问作者Neung Chung
相关产品推荐
相关产品推荐

