Приведите QVariant к QList <MyClass>из строки json - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь десериализовать MyClass из JSON.

//MyClass.h
class MyClass : public QObject
{
    Q_OBJECT

public:
    MyClass();
    MyClass(const MyClass& other);
    ~MyClass();

    int Counter = 0;
    QString Name;
    QVector<QString> NamesList;
    QJsonObject toJson() const;

};
Q_DECLARE_METATYPE(MyClass);

Строка json:

{
    "ClassList": [
        {
            "Counter": 100,
            "Name": "My Name",
            "NamesList": [
                "Name 1",
                "Name 2",
                "Name 3"
            ]
        },
        {
            "Counter": 5555,
            "Name": "2My Name",
            "NamesList": [
                "2Name 1",
                "2Name 2",
                "2Name 3"
            ]
        }
    ]
}

Я могу получить ClassList в QVariant следующим образом:

QVariantMap json_map = DeserializeFromJson(text);
QVariant listVariant = json_map["ClassList"];

Но я не могу разыграть listVariant до QList<MyClass>. Я попробовал следующие фрагменты, и каждый раз, когда результат пуст.

QList<MyClass> myList = listVariant.value<QList<MyClass> >(); // Empty
QList<MyClass> list = qvariant_cast<QList<MyClass>>(listVariant); // Empty

QSequentialIterable iterable = listVariant.value<QSequentialIterable>();
for each (QVariant it in iterable)
    {
        bool convertable = it.canConvert<MyClass>(); // false
        MyClass cl = it.value<MyClass>(); // Empty
        MyClass cl2 = qvariant_cast<MyClass>(it); // Empty

        QObject* object = qvariant_cast<QObject*>(it); // Empty
        MyClass* cl3 = qobject_cast<MyClass*>(object); // Empty

        QVariant var;
        var.setValue(it); 
        MyClass s2 = var.value<MyClass>(); // Empty
    }

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Переменная listVariant содержит QVariantList с QVariantMap элементами. Чтобы отменить преобразование listVariant в QList<MyClass>, необходимо преобразовать QVariantMap в MyClass, а затем QVariantList в QList<MyClass>. Вы можете сказать Qt, как это сделать, указав qvariant_cast template:

template <>
MyClass qvariant_cast<MyClass>(const QVariant& v) {
    MyClass result;
    result.Counter = v.toMap()["Counter"].toInt();
    result.Name = v.toMap()["Name"].toString();
    result.NamesList = v.toMap()["NamesList"].toStringString();
}

template <>
QList<MyClass> qvariant_cast<QList<MyClass>>(const QVariant& v) {
    QList<MyClass> result;
    foreach(const QVariant& item : v.toList()) {
        result.push_back(qvariant_cast<MyClass>(item));
    }
    return result;
}
0 голосов
/ 23 октября 2019

Вы можете использовать QVariantList вместо QList<MyClass>.

...