【问题标题】:Cast QVariant to QList<MyClass> from a json string将 QVariant 从 json 字符串转换为 QList<MyClass>
【发布时间】:2019-10-23 10:57:02
【问题描述】:

我正在尝试从 JSON 反序列化 MyClass

//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"
            ]
        }
    ]
}

我可以通过以下方式获取 QVariant 中的 ClassList:

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

但我无法将 listVariant 转换为 QList&lt;MyClass&gt;。 我试过下面的sn-ps,每次结果都是空的。

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
    }

【问题讨论】:

    标签: c++ arrays json qt deserialization


    【解决方案1】:

    您可以使用QVariantList而不是QList&lt;MyClass&gt;

    【讨论】:

    • 怎么投?
    • 您需要QVariantList listVariant = json_map["ClassList"]; 才能实现。然后只需for (const auto&amp; myClassVariant : listVariant) auto myClass = myClassVariant.value&lt;MyClass&gt;();
    • QVariantList listVariant = json_map["ClassList"] 不可能。从 QVariant 到 QVariantList 没有合适的演员表
    • 你试过用built-in JSON support吗?
    【解决方案2】:

    变量listVariant 包含QVariantListQVariantMap 项。要将listVariant 去实化为QList&lt;MyClass&gt;,您应该将QVariantMap 转换为MyClass,然后将QVariantList 转换为QList&lt;MyClass&gt;。你可以通过指定qvariant_cast模板来告诉Qt怎么做:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2018-06-28
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多