diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-07-10 13:42:28 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-07-25 09:00:46 +0000 |
commit | a06148e3414744cc4153f40a5610bad53ffebd62 (patch) | |
tree | 58791fdbefbd9548b154b85d933b6fa487518131 /src/corelib | |
parent | 1044074a49ecb66565c19a9e212b322fd6341d25 (diff) |
Improve symmetry of variant json conversions
Make QVariant::toJsonValue do conversions as well as
QJsonValue::fromVariant.
Change-Id: I175d43677061470691e2e0104a800be355fbbd3d
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/kernel/qvariant.cpp | 105 |
1 files changed, 103 insertions, 2 deletions
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index e6262124fb..29af0647ea 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -938,6 +938,107 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) return false; } break; +#ifndef QT_BOOTSTRAPPED + case QMetaType::QJsonValue: + switch (d->type) { + case QMetaType::Nullptr: + *static_cast<QJsonValue *>(result) = QJsonValue(QJsonValue::Null); + break; + case QVariant::Bool: + *static_cast<QJsonValue *>(result) = QJsonValue(d->data.b); + break; + case QMetaType::Int: + case QMetaType::UInt: + case QMetaType::Double: + case QMetaType::Float: + case QMetaType::ULong: + case QMetaType::Long: + case QMetaType::LongLong: + case QMetaType::ULongLong: + case QMetaType::UShort: + case QMetaType::UChar: + case QMetaType::Char: + case QMetaType::SChar: + case QMetaType::Short: + *static_cast<QJsonValue *>(result) = QJsonValue(qConvertToRealNumber(d, ok)); + Q_ASSERT(ok); + break; + case QVariant::String: + *static_cast<QJsonValue *>(result) = QJsonValue(*v_cast<QString>(d)); + break; + case QVariant::StringList: + *static_cast<QJsonValue *>(result) = QJsonValue(QJsonArray::fromStringList(*v_cast<QStringList>(d))); + break; + case QVariant::List: + *static_cast<QJsonValue *>(result) = QJsonValue(QJsonArray::fromVariantList(*v_cast<QVariantList>(d))); + break; + case QVariant::Map: + *static_cast<QJsonValue *>(result) = QJsonValue(QJsonObject::fromVariantMap(*v_cast<QVariantMap>(d))); + break; + case QVariant::Hash: + *static_cast<QJsonValue *>(result) = QJsonValue(QJsonObject::fromVariantHash(*v_cast<QVariantHash>(d))); + break; + case QMetaType::QJsonObject: + *static_cast<QJsonValue *>(result) = *v_cast<QJsonObject>(d); + break; + case QMetaType::QJsonArray: + *static_cast<QJsonValue *>(result) = *v_cast<QJsonArray>(d); + break; + case QMetaType::QJsonDocument: { + QJsonDocument doc = *v_cast<QJsonDocument>(d); + *static_cast<QJsonValue *>(result) = doc.isArray() ? QJsonValue(doc.array()) : QJsonValue(doc.object()); + break; + } + default: + *static_cast<QJsonValue *>(result) = QJsonValue(QJsonValue::Undefined); + return false; + } + break; + case QMetaType::QJsonArray: + switch (d->type) { + case QVariant::StringList: + *static_cast<QJsonArray *>(result) = QJsonArray::fromStringList(*v_cast<QStringList>(d)); + break; + case QVariant::List: + *static_cast<QJsonArray *>(result) = QJsonArray::fromVariantList(*v_cast<QVariantList>(d)); + break; + case QMetaType::QJsonValue: + if (!v_cast<QJsonValue>(d)->isArray()) + return false; + *static_cast<QJsonArray *>(result) = v_cast<QJsonValue>(d)->toArray(); + break; + case QMetaType::QJsonDocument: + if (!v_cast<QJsonDocument>(d)->isArray()) + return false; + *static_cast<QJsonArray *>(result) = v_cast<QJsonDocument>(d)->array(); + break; + default: + return false; + } + break; + case QMetaType::QJsonObject: + switch (d->type) { + case QVariant::Map: + *static_cast<QJsonObject *>(result) = QJsonObject::fromVariantMap(*v_cast<QVariantMap>(d)); + break; + case QVariant::Hash: + *static_cast<QJsonObject *>(result) = QJsonObject::fromVariantHash(*v_cast<QVariantHash>(d)); + break; + case QMetaType::QJsonValue: + if (!v_cast<QJsonValue>(d)->isObject()) + return false; + *static_cast<QJsonObject *>(result) = v_cast<QJsonValue>(d)->toObject(); + break; + case QMetaType::QJsonDocument: + if (v_cast<QJsonDocument>(d)->isArray()) + return false; + *static_cast<QJsonObject *>(result) = v_cast<QJsonDocument>(d)->object(); + break; + default: + return false; + } + break; +#endif default: #ifndef QT_NO_QOBJECT if (d->type == QVariant::String || d->type == QVariant::ByteArray) { @@ -3106,8 +3207,8 @@ bool QVariant::canConvert(int targetTypeId) const } } - if (currentType == QMetaType::QJsonValue) { - switch (targetTypeId) { + if (currentType == QMetaType::QJsonValue || targetTypeId == QMetaType::QJsonValue) { + switch (currentType == QMetaType::QJsonValue ? targetTypeId : currentType) { case QMetaType::Nullptr: case QMetaType::QString: case QMetaType::Bool: |