我使用QJsonObject接收JSON中的数据。对于JSON中的键,我还有一个QObject-based对象保存属性(使用Q_PROPERTY(...) )。既然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对象中都有相应的键,所以我非常喜欢在不更改原始对象的情况下在那里捕获它们。类似于:
jo["test"].toVariant().canConvert<staticMetaObject->property(staticMetaObject->propertyOffset()).type()>()发布于 2016-10-14 13:36:38
不使用模板化的bool QVariant::canConvert<T>(),而是可以使用bool QVariant::canConvert(int targetTypeId)。
QMetaProperty po = staticMetaObject->property(staticMetaObject->propertyOffset());
jo["test"].toVariant().canConvert(po.type());https://stackoverflow.com/questions/40044478
复制相似问题