Я получаю данные в JSON, используя QJsonObject
. У меня также есть свойства размещения объектов на основе QObject
, используя Q_PROPERTY(...)
, для ключей в JSON. Поскольку Qt теперь имеет несколько типов данных, чем JSON, как можно проверить, являются ли они конвертируемыми.Проверьте, разрешен ли QVariant на другой тип QVariant
Типы данных, используемые в объекте, как правило, являются одним из следующих, но не ограничиваясь
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()>()
На самом деле я нашел решение на последней строке ... Существует 'bool QVariant :: canConvert (int targetTypeId)' ... –