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>bb10
parent
1044074a49
commit
a06148e341
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -80,7 +80,10 @@ private Q_SLOTS:
|
|||
|
||||
void undefinedValues();
|
||||
|
||||
void fromVariant_data();
|
||||
void fromVariant();
|
||||
void toVariant_data();
|
||||
void toVariant();
|
||||
void fromVariantMap();
|
||||
void fromVariantHash();
|
||||
void toVariantMap();
|
||||
|
|
@ -1095,8 +1098,11 @@ void tst_QtJson::undefinedValues()
|
|||
QCOMPARE(array.at(-1).type(), QJsonValue::Undefined);
|
||||
}
|
||||
|
||||
void tst_QtJson::fromVariant()
|
||||
void tst_QtJson::fromVariant_data()
|
||||
{
|
||||
QTest::addColumn<QVariant>("variant");
|
||||
QTest::addColumn<QJsonValue>("jsonvalue");
|
||||
|
||||
bool boolValue = true;
|
||||
int intValue = -1;
|
||||
uint uintValue = 1;
|
||||
|
|
@ -1119,44 +1125,66 @@ void tst_QtJson::fromVariant()
|
|||
variantList.append(doubleValue);
|
||||
variantList.append(stringValue);
|
||||
variantList.append(stringList);
|
||||
variantList.append(QVariant());
|
||||
variantList.append(QVariant::fromValue(nullptr));
|
||||
QJsonArray jsonArray_variant;
|
||||
jsonArray_variant.append(boolValue);
|
||||
jsonArray_variant.append(floatValue);
|
||||
jsonArray_variant.append(doubleValue);
|
||||
jsonArray_variant.append(stringValue);
|
||||
jsonArray_variant.append(jsonArray_string);
|
||||
jsonArray_variant.append(QJsonValue());
|
||||
jsonArray_variant.append(QJsonValue(QJsonValue::Null));
|
||||
|
||||
QVariantMap variantMap;
|
||||
variantMap["bool"] = boolValue;
|
||||
variantMap["float"] = floatValue;
|
||||
variantMap["string"] = stringValue;
|
||||
variantMap["array"] = variantList;
|
||||
QVariantHash variantHash;
|
||||
variantHash["bool"] = boolValue;
|
||||
variantHash["float"] = floatValue;
|
||||
variantHash["string"] = stringValue;
|
||||
variantHash["array"] = variantList;
|
||||
QJsonObject jsonObject;
|
||||
jsonObject["bool"] = boolValue;
|
||||
jsonObject["float"] = floatValue;
|
||||
jsonObject["string"] = stringValue;
|
||||
jsonObject["array"] = jsonArray_variant;
|
||||
|
||||
QCOMPARE(QJsonValue::fromVariant(QVariant::fromValue(nullptr)), QJsonValue(QJsonValue::Null));
|
||||
QCOMPARE(QJsonValue::fromVariant(QVariant(boolValue)), QJsonValue(boolValue));
|
||||
QCOMPARE(QJsonValue::fromVariant(QVariant(intValue)), QJsonValue(intValue));
|
||||
QCOMPARE(QJsonValue::fromVariant(QVariant(uintValue)), QJsonValue(static_cast<double>(uintValue)));
|
||||
QCOMPARE(QJsonValue::fromVariant(QVariant(longlongValue)), QJsonValue(longlongValue));
|
||||
QCOMPARE(QJsonValue::fromVariant(QVariant(ulonglongValue)), QJsonValue(static_cast<double>(ulonglongValue)));
|
||||
QCOMPARE(QJsonValue::fromVariant(QVariant(floatValue)), QJsonValue(static_cast<double>(floatValue)));
|
||||
QCOMPARE(QJsonValue::fromVariant(QVariant(doubleValue)), QJsonValue(doubleValue));
|
||||
QCOMPARE(QJsonValue::fromVariant(QVariant(stringValue)), QJsonValue(stringValue));
|
||||
QCOMPARE(QJsonValue::fromVariant(QVariant(stringList)), QJsonValue(jsonArray_string));
|
||||
QCOMPARE(QJsonValue::fromVariant(QVariant(variantList)), QJsonValue(jsonArray_variant));
|
||||
QCOMPARE(QJsonValue::fromVariant(QVariant(variantMap)), QJsonValue(jsonObject));
|
||||
QTest::newRow("nullptr") << QVariant::fromValue(nullptr) << QJsonValue(QJsonValue::Null);
|
||||
QTest::newRow("bool") << QVariant(boolValue) << QJsonValue(boolValue);
|
||||
QTest::newRow("int") << QVariant(intValue) << QJsonValue(intValue);
|
||||
QTest::newRow("uint") << QVariant(uintValue) << QJsonValue(static_cast<double>(uintValue));
|
||||
QTest::newRow("longlong") << QVariant(longlongValue) << QJsonValue(longlongValue);
|
||||
QTest::newRow("ulonglong") << QVariant(ulonglongValue) << QJsonValue(static_cast<double>(ulonglongValue));
|
||||
QTest::newRow("float") << QVariant(floatValue) << QJsonValue(floatValue);
|
||||
QTest::newRow("double") << QVariant(doubleValue) << QJsonValue(doubleValue);
|
||||
QTest::newRow("string") << QVariant(stringValue) << QJsonValue(stringValue);
|
||||
QTest::newRow("stringList") << QVariant(stringList) << QJsonValue(jsonArray_string);
|
||||
QTest::newRow("variantList") << QVariant(variantList) << QJsonValue(jsonArray_variant);
|
||||
QTest::newRow("variantMap") << QVariant(variantMap) << QJsonValue(jsonObject);
|
||||
QTest::newRow("variantHash") << QVariant(variantHash) << QJsonValue(jsonObject);
|
||||
}
|
||||
|
||||
QVERIFY(QJsonValue::fromVariant(QVariant(QJsonValue(true))).isBool());
|
||||
QVERIFY(QJsonValue::fromVariant(QVariant(jsonArray_string)).isArray());
|
||||
QVERIFY(QJsonValue::fromVariant(QVariant(QJsonDocument(jsonArray_string))).isArray());
|
||||
QVERIFY(QJsonValue::fromVariant(QVariant(jsonObject)).isObject());
|
||||
QVERIFY(QJsonValue::fromVariant(QVariant(QJsonDocument(jsonObject))).isObject());
|
||||
void tst_QtJson::fromVariant()
|
||||
{
|
||||
QFETCH( QVariant, variant );
|
||||
QFETCH( QJsonValue, jsonvalue );
|
||||
|
||||
QCOMPARE(QJsonValue::fromVariant(variant), jsonvalue);
|
||||
QCOMPARE(variant.toJsonValue(), jsonvalue);
|
||||
}
|
||||
|
||||
void tst_QtJson::toVariant_data()
|
||||
{
|
||||
fromVariant_data();
|
||||
}
|
||||
|
||||
void tst_QtJson::toVariant()
|
||||
{
|
||||
QFETCH( QVariant, variant );
|
||||
QFETCH( QJsonValue, jsonvalue );
|
||||
|
||||
QCOMPARE(jsonvalue.toVariant(), variant);
|
||||
}
|
||||
|
||||
void tst_QtJson::fromVariantMap()
|
||||
|
|
|
|||
Loading…
Reference in New Issue