В цикле с каждой итерацией вы создаете новый документ 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 } }"
}