diff options
-rw-r--r-- | src/corelib/serialization/qjsonvalue.cpp | 11 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/json/tst_qtjson.cpp | 20 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/corelib/serialization/qjsonvalue.cpp b/src/corelib/serialization/qjsonvalue.cpp index 33707b6ec3..989d6d51db 100644 --- a/src/corelib/serialization/qjsonvalue.cpp +++ b/src/corelib/serialization/qjsonvalue.cpp @@ -40,6 +40,7 @@ #include <qjsonobject.h> #include <qjsonvalue.h> #include <qjsonarray.h> +#include <qurl.h> #include <qvariant.h> #include <qstringlist.h> #include <qdebug.h> @@ -407,6 +408,14 @@ QJsonValue &QJsonValue::operator =(const QJsonValue &other) \li QMetaType::QVariantHash \endlist \li QJsonValue::Object + + \row + \li + \list + \li QMetaType::QUrl + \endlist + \li QJsonValue::String. The conversion will use QUrl::toString() with flag + QUrl::FullyEncoded, so as to ensure maximum compatibility in parsing the URL \endtable For all other QVariant types a conversion to a QString will be attempted. If the returned string @@ -439,6 +448,8 @@ QJsonValue QJsonValue::fromVariant(const QVariant &variant) case QVariant::Hash: return QJsonValue(QJsonObject::fromVariantHash(variant.toHash())); #ifndef QT_BOOTSTRAPPED + case QVariant::Url: + return QJsonValue(variant.toUrl().toString(QUrl::FullyEncoded)); case QMetaType::QJsonValue: return variant.toJsonValue(); case QMetaType::QJsonObject: diff --git a/tests/auto/corelib/serialization/json/tst_qtjson.cpp b/tests/auto/corelib/serialization/json/tst_qtjson.cpp index 1e3604ac9e..19e53ad2b6 100644 --- a/tests/auto/corelib/serialization/json/tst_qtjson.cpp +++ b/tests/auto/corelib/serialization/json/tst_qtjson.cpp @@ -82,6 +82,8 @@ private Q_SLOTS: void fromVariant_data(); void fromVariant(); + void fromVariantSpecial_data(); + void fromVariantSpecial(); void toVariant_data(); void toVariant(); void fromVariantMap(); @@ -1174,6 +1176,24 @@ void tst_QtJson::fromVariant() QCOMPARE(variant.toJsonValue(), jsonvalue); } +void tst_QtJson::fromVariantSpecial_data() +{ + QTest::addColumn<QVariant>("variant"); + QTest::addColumn<QJsonValue>("jsonvalue"); + + // Qt types with special encoding + QTest::newRow("url") << QVariant(QUrl("https://example.com/\xc2\xa9 ")) + << QJsonValue("https://example.com/%C2%A9%20"); +} + +void tst_QtJson::fromVariantSpecial() +{ + QFETCH( QVariant, variant ); + QFETCH( QJsonValue, jsonvalue ); + + QCOMPARE(QJsonValue::fromVariant(variant), jsonvalue); +} + void tst_QtJson::toVariant_data() { fromVariant_data(); |