summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/serialization/qjsonvalue.cpp11
-rw-r--r--tests/auto/corelib/serialization/json/tst_qtjson.cpp20
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();