You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:39:03