如何将多个 QJsonObject 添加到 QJsonDocument - Qt
How I can add more than one QJsonObject to a QJsonDocument - Qt
我想向 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 } }"
}
我想向 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 } }"
}