QJsonObject
을 사용하여 JSON으로 데이터를 수신합니다. 또한 QObject
기반의 객체 보유 속성이 있으며 Q_PROPERTY(...)
을 사용하여 JSON의 키에 사용됩니다. Qt에는 JSON보다 더 많은 데이터 유형이 있기 때문에 어떻게 변환 할 수 있는지 확인할 수 있습니다. 객체에 사용QVariant가 다른 QVariant 유형으로 변환 가능한지 확인하십시오.
데이터 유형은 일반적으로 다음 중 하나지만 아이디어는 자동으로 QJsonObject
의 모든 키/값에 대한 QOject 파생 된 개체에 setProperty(...)
를 호출하는 것입니다
uint
double
QString
QDateTime
bool
에 제한되지 않는다. JSON에서 잘못된 형식의 입력으로 인해 실패 할 수 있으므로 QMetaProperty
및 QJsonObject/QVariantMap
데이터를 기반으로 유효성을 확인해야합니다.
모든 데이터 형식에 대해 수동 검사를 구현하는 기본 클래스로 generic을 실행해야하므로 실패합니다. 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());
}
은 정말 내 원래 객체를 변경하지 않고 이미 이러한 잡을 것을 좋아합니다. 대신 bool QVariant::canConvert<T>()
하나 bool QVariant::canConvert(int targetTypeId)
를 사용할 수있는 템플릿 사용
jo["test"].toVariant().canConvert<staticMetaObject->property(staticMetaObject->propertyOffset()).type()>()
실제로 마지막 줄에서 해결책을 찾았습니다. 'bool QVariant :: canConvert (int targetTypeId)'... –