从 json 字符串将 QVariant 转换为 QList<MyClass>

Cast QVariant to QList<MyClass> from a json string

本文关键字:lt MyClass gt QList 字符串 json QVariant 转换      更新时间:2023-10-16

我正在尝试从 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 中的类列表:

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
}

您可以使用QVariantList而不是QList<MyClass>

>变量listVariant包含QVariantMap项的QVariantList。要把listVariant变成QList<MyClass>,你应该把QVariantMap转换为MyClass,然后QVariantList转换为QList<MyClass>。你可以通过指定模板来告诉Qt如何qvariant_cast

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