summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/json/qjsonvalue.cpp22
-rw-r--r--src/corelib/json/qjsonvalue.h5
-rw-r--r--tests/auto/corelib/json/tst_qtjson.cpp8
3 files changed, 32 insertions, 3 deletions
diff --git a/src/corelib/json/qjsonvalue.cpp b/src/corelib/json/qjsonvalue.cpp
index 0a603b958a..c16824ebd2 100644
--- a/src/corelib/json/qjsonvalue.cpp
+++ b/src/corelib/json/qjsonvalue.cpp
@@ -175,7 +175,24 @@ QJsonValue::QJsonValue(qint64 n)
QJsonValue::QJsonValue(const QString &s)
: d(0), t(String)
{
- stringData = *(QStringData **)(&s);
+ stringDataFromQStringHelper(s);
+}
+
+/*!
+ \fn QJsonValue::QJsonValue(const char *s)
+
+ Creates a value of type String with value \a s, assuming
+ UTF-8 encoding of the input.
+
+ You can disable this constructor by defining \c
+ QT_NO_CAST_FROM_ASCII when you compile your applications.
+
+ \since 5.3
+ */
+
+void QJsonValue::stringDataFromQStringHelper(const QString &string)
+{
+ stringData = *(QStringData **)(&string);
stringData->ref.ref();
}
@@ -187,8 +204,7 @@ QJsonValue::QJsonValue(QLatin1String s)
{
// ### FIXME: Avoid creating the temp QString below
QString str(s);
- stringData = *(QStringData **)(&str);
- stringData->ref.ref();
+ stringDataFromQStringHelper(str);
}
/*!
diff --git a/src/corelib/json/qjsonvalue.h b/src/corelib/json/qjsonvalue.h
index c0ecdd2b61..fe028990c0 100644
--- a/src/corelib/json/qjsonvalue.h
+++ b/src/corelib/json/qjsonvalue.h
@@ -82,6 +82,10 @@ public:
QJsonValue(qint64 n);
QJsonValue(const QString &s);
QJsonValue(QLatin1String s);
+#ifndef QT_NO_CAST_FROM_ASCII
+ inline QT_ASCII_CAST_WARN QJsonValue(const char *s)
+ : d(0), t(String) { stringDataFromQStringHelper(QString::fromUtf8(s)); }
+#endif
QJsonValue(const QJsonArray &a);
QJsonValue(const QJsonObject &o);
@@ -123,6 +127,7 @@ private:
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonValue &);
QJsonValue(QJsonPrivate::Data *d, QJsonPrivate::Base *b, const QJsonPrivate::Value& v);
+ void stringDataFromQStringHelper(const QString &string);
void detach();
diff --git a/tests/auto/corelib/json/tst_qtjson.cpp b/tests/auto/corelib/json/tst_qtjson.cpp
index 45ce836cbf..2312922a58 100644
--- a/tests/auto/corelib/json/tst_qtjson.cpp
+++ b/tests/auto/corelib/json/tst_qtjson.cpp
@@ -2242,6 +2242,14 @@ void tst_QtJson::valueEquals()
QVERIFY(QJsonValue(QJsonObject()) != QJsonValue(true));
QVERIFY(QJsonValue(QJsonObject()) != QJsonValue(1.));
QVERIFY(QJsonValue(QJsonObject()) != QJsonValue(QJsonArray()));
+
+ QVERIFY(QJsonValue("foo") == QJsonValue(QLatin1String("foo")));
+ QVERIFY(QJsonValue("foo") == QJsonValue(QString("foo")));
+ QVERIFY(QJsonValue("\x66\x6f\x6f") == QJsonValue(QString("foo")));
+ QVERIFY(QJsonValue("\x62\x61\x72") == QJsonValue("bar"));
+ QVERIFY(QJsonValue(UNICODE_NON_CHARACTER) == QJsonValue(QString(UNICODE_NON_CHARACTER)));
+ QVERIFY(QJsonValue(UNICODE_DJE) == QJsonValue(QString(UNICODE_DJE)));
+ QVERIFY(QJsonValue("\xc3\xa9") == QJsonValue(QString("\xc3\xa9")));
}
void tst_QtJson::bom()