我使用QJsonObject
以JSON格式接收数据。我还有一个基于QObject
的对象,使用Q_PROPERTY(...)
为JSON中的键保存属性。由于Qt现在有比JSON更多的数据类型,因此如何检查它们是否可以转换。
对象中使用的数据类型通常是以下之一,但不限于
uint
double
QString
QDateTime
bool
我们的想法是针对setProperty(...)
中的每个键/值,在QOject派生对象上自动调用QJsonObject
。由于JSON输入格式错误可能会失败,因此我必须根据QMetaProperty
和QJsonObject/QVariantMap
数据检查有效性。
因为这应该作为基类运行泛型,实现每个数据类型的手动检查失败。我知道有QVariant::isConvertible<T>()
。
#include <QJsonObject>
#include <QVariant>
#include <QMetaObject>
#include <QMetaProperty>
class Test {
Q_GADGET
Q_PROPERTY(QString test)
QString m_test;
QJsonObject jo;
void call();
}
void Test::call()
{
jo.insert("test",QJsonValue(5));
// This will fail, since int is not convertible to QString implicitly
staticMetaObject->property(staticMetaObject->propertyOffset()).writeOnGadget(this,jo["test"].toVariant());
}
因为我之前正在解析JSON以检查每个属性是否在JSON-Object中都有相应的键我真的很想抓住它们而没有改变我的原始对象。类似的东西:
jo["test"].toVariant().canConvert<staticMetaObject->property(staticMetaObject->propertyOffset()).type()>()
答案 0 :(得分:2)
不使用模板bool QVariant::canConvert<T>()
,而是使用bool QVariant::canConvert(int targetTypeId)
。
QMetaProperty po = staticMetaObject->property(staticMetaObject->propertyOffset());
jo["test"].toVariant().canConvert(po.type());