QJsonObject
を使用してJSONでデータを受信しました。私はまた、Q_PROPERTY(...)
を使用して、QObject
ベースのオブジェクト保持プロパティをJSONのキーに持っています。 QtはJSONよりもいくつかのデータ型を持っているので、どのように変換可能かどうかを調べることができます。オブジェクトで使用QVariantが他のQVariantタイプに変換可能かどうかを確認
データ型は、通常、次の1ですが、
uint
double
QString
QDateTime
bool
に限られるものではないという考えは、自動的にQJsonObject
の全てのキー/値のためQOject派生オブジェクトにsetProperty(...)
を呼び出すことです。これはJSONの不正な入力のために失敗する可能性があるので、私はQMetaProperty
とQJsonObject/QVariantMap
のデータに基づいて妥当性をチェックする必要があります。
これは、すべてのデータ型の手動チェックを実装する基本クラスとして汎用を実行するので失敗します。私はQVariant::isConvertible<T>()
があることを知っています。すべてのプロパティは、JSONオブジェクトに対応するキーを持っているでしょうかどうかを確認する前に、私はJSONをパースしておりますので
#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());
}
は、私は本当に私の元のオブジェクトを変更せずに、すでにそこにこれらをキャッチしたいです。以下のような何か:
jo["test"].toVariant().canConvert<staticMetaObject->property(staticMetaObject->propertyOffset()).type()>()
実際には最後の行に解決策が見つかりました。「bool QVariant :: canConvert(int targetTypeId) 'があります。 –