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
相关产品推荐
相关产品推荐

