Создание QList из QMaps из QString - PullRequest
0 голосов
/ 20 октября 2019

У меня проблемы с десериализацией, смотри, у меня QString вот так:

[{"value": "", "type": "tag", "name": "Output Tag", "param": "outputtag"}, {"value": "black", "type": "colour", "name": "Init Colour", "param": "initcolour"}, {"value": "", "type": "colour", "name": "Off Colour", "param": "offcolour"}, {"value": "", "type": "colour", "name": "On Colour", "param": "oncolour"}]

Хорошо, теперь я хочу сделать QList из QMap из строки выше,так просто, но сбивает с толку, я должен разобрать мою строку вручную? или есть какой-нибудь код или инструмент, который может сделать это для меня бесплатно? :))

1 Ответ

1 голос
/ 20 октября 2019

Это похоже на массив JSON, так что вам повезло. Qt имеет поддержку JSON , так что вы можете использовать это для анализа. Вот пример кода.

#include <QDebug>

#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>

#include <QList>
#include <QMap>

int main()
{
    // R"( is C++ raw string literal prefix
    QString inputString = R"(
[{"value": "", "type": "tag", "name": "Output Tag", "param": "outputtag"}, {"value": "black", "type": "colour", "name": "Init Colour", "param": "initcolour"}, {"value": "", "type": "colour", "name": "Off Colour", "param": "offcolour"}, {"value": "", "type": "colour", "name": "On Colour", "param": "oncolour"}]
)";

    QJsonParseError error;
    auto jsonDocument = QJsonDocument::fromJson(inputString.toUtf8(), &error);
    if (jsonDocument.isNull()) {
        qDebug() << "Parse error:" << error.errorString();
        return EXIT_FAILURE;
    }
    qDebug() << "Parsed QJsonDocument:\n" << jsonDocument;

    QList<QMap<QString, QString> > listOfMaps;

    if (!jsonDocument.isArray()) {
        qDebug() << "Invalid input, expecting array";
        return EXIT_FAILURE;
    }
    for(QJsonValue mapObject : jsonDocument.array()) {
        if(!mapObject.isObject()) {
            qDebug() << "Invalid input, expecting array of objects";
            return EXIT_FAILURE;
        }

        listOfMaps.append(QMap<QString, QString>{});
        for(QString key: mapObject.toObject().keys()) {
            listOfMaps.last().insert(key, mapObject[key].toString());
        }
    }

    qDebug() << "Resulting list of maps:\n" << listOfMaps;

    return EXIT_SUCCESS;
}
...