c++ - 如何将多个 QJsonObject 添加到 QJsonDocument - Qt

标签 c++ json qt qjson qjsonobject

我想向 QJsonDocument 添加多个 QJsonObject 而不是 QJsonArray。这可能吗?它应该看起来像这样:

{
    "Obj1" : {
        "objID": "111",
        "C1" : {
            "Name":"Test1",
            "Enable" : true
        }
    },
    "Obj2" : {
        "objID": "222",
        "C2" : {
            "Name":"Test2",
            "Enable" : true
        }
    }
}

我引用了 this但我不想使用 JsonArray。只想使用 JsonObject 。我在这里也提到了更多答案,但找不到任何解决方案。

我试过这个:

QTextStream stream(&file);
for(int idx(0); idx < obj.count(); ++idx)
{
    QJsonObject jObject;
    this->popData(jObject); // Get the Filled Json Object
    QJsonDocument jDoc(jObject);
    stream << jDoc.toJson() << endl;
}
file.close();

输出

{
    "Obj1" : {
        "objID": "111",
        "C1" : {
            "Name":"Test1",
            "Enable" : true
        }
    }
}

{
    "Obj2" : {
        "objID": "222",
        "C2" : {
            "Name":"Test2",
            "Enable" : true
        }
    }
}

最佳答案

在循环中,每次迭代都会创建一个新的 JSON 文档并将其写入流中。这意味着它们都是多个独立的文件。您需要创建一个 QJsonObject(父对象)并将所有其他对象作为其一部分填充它,即嵌套对象。然后,您将只有一个对象,在循环之后您可以创建一个 QJsonDocument 并使用它写入文件。

这是每次迭代都会创建一个新文档的代码:

for ( /* ... */ )
{
    // ...
    QJsonDocument jDoc(jObject);        // new document without obj append
    stream << jDoc.toJson() << endl;    // appends new document at the end
    // ...
}

这是您需要做的:

// Create a JSON object
// Loop over all the objects
//    Append objects in loop
// Create document after loop
// Write to file

这是一个小的工作示例:

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QString>
#include <QDebug>
#include <map>

int main()
{
    const std::map<QString, QString> data
    {
        { "obj1", R"({ "id": 1, "info": { "type": 11, "code": 111 } })" },
        { "obj2", R"({ "id": 2, "info": { "type": 22, "code": 222 } })" }
    };

    QJsonObject jObj;
    for ( const auto& p : data )
    {
        jObj.insert( p.first, QJsonValue::fromVariant( p.second ) );
    }

    QJsonDocument doc { jObj };
    qDebug() << qPrintable( doc.toJson( QJsonDocument::Indented ) );

    return 0;
}

输出:

{
    "obj1": "{ \"id\": 1, \"info\": { \"type\": 11, \"code\": 111 } }",
    "obj2": "{ \"id\": 2, \"info\": { \"type\": 22, \"code\": 222 } }"
}

关于c++ - 如何将多个 QJsonObject 添加到 QJsonDocument - Qt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55193946/

相关文章:

java - 使用 Jackson 反序列化枚举 Shape.OBJECT 失败

java - Jackson 预处理反序列化

python - Pyqt:获取光标下的文本

c++ - QString 仅替换第一次出现

c++ - {x} 和 '= {x}' 初始化之间有什么区别(如果有)?

c++ - std::unordered_set::find - 仅为 find() 构造一个实例

c++ - 未初始化 vector 中的元素值是多少?

javascript - D3 - 路径输出 0px x 0px - map 不会显示 - 不知道如何使用投影

c++ - 没有函数参数的可变参数模板

c++ - QCache 和 QSharedPointer