Как я могу добавить более одного QJsonObject в QJsonDocument - Qt - PullRequest
1 голос
/ 16 марта 2019

Я хочу добавить более одного QJsonObject, а не QJsonArray в QJsonDocument. Это возможно? Это должно выглядеть так:

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

Я упоминал это , но я не хочу использовать 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
        }
    }
}

1 Ответ

3 голосов
/ 16 марта 2019

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