diff options
-rw-r--r-- | src/corelib/json/qjsonvalue.cpp | 22 | ||||
-rw-r--r-- | src/corelib/json/qjsonvalue.h | 5 | ||||
-rw-r--r-- | tests/auto/corelib/json/tst_qtjson.cpp | 8 |
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() |