从 json 字符串将 QVariant 转换为 QList<MyClass>
Cast QVariant to QList<MyClass> from a json string
我正在尝试从 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;
}
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- 反转C++ foo(MyClass &) vs foo(const MyClass &)
- 如何显式调用运算符<<
- 从 json 字符串将 QVariant 转换为 QList<MyClass>
- #include "MyClass.h" 和 #include ".myclass.h" 有什么区别
- MyClass obj = MyClass();'MyClass()'在这里指的是临时对象吗?
- 'return':无法从'const class myClass'转换为'class myClass &'
- 如何初始化 const std::vector<MyClass>
- "delete p"和"p->~MyClass()"之间的区别
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- 'class MyClass' 在尝试定义静态结构实例时不会命名类型
- 注意:候选:MyClass:MyClass(const MyClass&) 错误
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;