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

C++ Qt循环中向QJsonArray添加数据生成嵌套JSON遇空输出问题

问题根源

你代码的核心问题是QJsonDocument::setArray()传入的是参数的值拷贝,你在初始化阶段就把空的root数组设置给了doc,后续修改root变量不会同步更新doc内部存储的数组结构,所以最终输出为空。和你猜测的局部变量销毁、需要堆分配完全无关,Qt的QJsonArray/QJsonObject都是值类型,支持栈上直接使用。

修复方案

只需要调整setArray的调用时机,等你把root数组的所有内容填充完成后,再绑定到QJsonDocument即可。

修复后的代码如下:

#include <QDebug>
#include <QJsonArray>
#include <QJsonDocument>
#include <QSet>
#include <QString>
#include <QVector>

int main(int argc, char *argv[]) {
  QVector<QSet<int>> sets;
  QSet<int> testSet;
  QJsonDocument doc;
  QJsonArray root;
  // 提前绑定空数组不会同步后续修改,所以删掉此处的doc.setArray(root)

  testSet.insert(0);
  testSet.insert(1);
  testSet.insert(2);
  QSet<int> testSet1;
  testSet1.insert(3);
  testSet1.insert(4);

  sets.push_back(testSet);
  sets.push_back(testSet1);

  for (auto set : sets) {
    QJsonArray setJSON;

    for (int i : set) {
      setJSON.append(i);
    }

    root.append(setJSON);
  }
  // 填充完成后再设置给doc
  doc.setArray(root);
  qDebug() << doc.toJson();
}

运行后输出的嵌套JSON结构符合预期:

[
    [
        0,
        1,
        2
    ],
    [
        3,
        4
    ]
]

补充说明

Qt中所有QJson*开头的存储类(除了QJsonDocument)都是隐式共享的值类型,拷贝成本极低,完全可以在栈上创建、作为局部变量使用,不需要手动堆分配,也不存在局部作用域销毁导致外部引用失效的问题。

内容的提问来源于stack exchange,提问作者richbai90

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:15:04