summaryrefslogtreecommitdiffstats
path: root/src/corelib/serialization/qjsondocument.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/serialization/qjsondocument.cpp')
-rw-r--r--src/corelib/serialization/qjsondocument.cpp296
1 files changed, 36 insertions, 260 deletions
diff --git a/src/corelib/serialization/qjsondocument.cpp b/src/corelib/serialization/qjsondocument.cpp
index 338b752f13..e2528f18dc 100644
--- a/src/corelib/serialization/qjsondocument.cpp
+++ b/src/corelib/serialization/qjsondocument.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qjsondocument.h>
#include <qjsonobject.h>
@@ -43,6 +7,8 @@
#include <qjsonarray.h>
#include <qstringlist.h>
#include <qvariant.h>
+#include <qmap.h>
+#include <qhash.h>
#include <qdebug.h>
#include <qcbormap.h>
#include <qcborarray.h>
@@ -52,28 +18,23 @@
#include "qjson_p.h"
#include "qdatastream.h"
-#if QT_CONFIG(binaryjson)
-#include "qbinaryjson_p.h"
-#include "qbinaryjsonobject_p.h"
-#include "qbinaryjsonarray_p.h"
-#endif
-
-#include <private/qmemory_p.h>
-
QT_BEGIN_NAMESPACE
/*! \class QJsonDocument
\inmodule QtCore
\ingroup json
\ingroup shared
+ \ingroup qtserialization
\reentrant
\since 5.0
\brief The QJsonDocument class provides a way to read and write JSON documents.
- QJsonDocument is a class that wraps a complete JSON document and can read and
- write this document both from a UTF-8 encoded text based representation as well
- as Qt's own binary format.
+ \compares equality
+
+ QJsonDocument is a class that wraps a complete JSON document and can read
+ this document from, and write it to, a UTF-8 encoded text-based
+ representation.
A JSON document can be converted from its text-based representation to a QJsonDocument
using QJsonDocument::fromJson(). toJson() converts it back to text. The parser is very
@@ -85,10 +46,7 @@ QT_BEGIN_NAMESPACE
and isObject(). The array or object contained in the document can be retrieved using
array() or object() and then read or manipulated.
- A document can also be created from a stored binary representation using fromBinaryData() or
- fromRawData().
-
- \sa {JSON Support in Qt}, {JSON Save Game Example}
+ \sa {JSON Support in Qt}, {Saving and Loading a Game}
*/
@@ -148,7 +106,7 @@ QJsonDocument::QJsonDocument(const QJsonArray &array)
\internal
*/
QJsonDocument::QJsonDocument(const QCborValue &data)
- : d(qt_make_unique<QJsonDocumentPrivate>(data))
+ : d(std::make_unique<QJsonDocumentPrivate>(data))
{
Q_ASSERT(d);
}
@@ -167,7 +125,7 @@ QJsonDocument::QJsonDocument(const QJsonDocument &other)
{
if (other.d) {
if (!d)
- d = qt_make_unique<QJsonDocumentPrivate>();
+ d = std::make_unique<QJsonDocumentPrivate>();
d->value = other.d->value;
} else {
d.reset();
@@ -193,7 +151,7 @@ QJsonDocument &QJsonDocument::operator =(const QJsonDocument &other)
if (this != &other) {
if (other.d) {
if (!d)
- d = qt_make_unique<QJsonDocumentPrivate>();
+ d = std::make_unique<QJsonDocumentPrivate>();
else
d->clearRawData();
d->value = other.d->value;
@@ -225,180 +183,7 @@ QJsonDocument &QJsonDocument::operator =(const QJsonDocument &other)
Swaps the document \a other with this. This operation is very fast and never fails.
*/
-
-/*! \enum QJsonDocument::DataValidation
-
- This value is used to tell QJsonDocument whether to validate the binary data
- when converting to a QJsonDocument using fromBinaryData() or fromRawData().
-
- \value Validate Validate the data before using it. This is the default.
- \value BypassValidation Bypasses data validation. Only use if you received the
- data from a trusted place and know it's valid, as using of invalid data can crash
- the application.
- */
-
-#if QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15)
-/*!
- \deprecated
-
- Creates a QJsonDocument that uses the first \a size bytes from
- \a data. It assumes \a data contains a binary encoded JSON document.
- The created document does not take ownership of \a data. The data is
- copied into a different data structure, and the original data can be
- deleted or modified afterwards.
-
- \a data has to be aligned to a 4 byte boundary.
-
- \a validation decides whether the data is checked for validity before being used.
- By default the data is validated. If the \a data is not valid, the method returns
- a null document.
-
- Returns a QJsonDocument representing the data.
-
- \note Deprecated in Qt 5.15. The binary JSON encoding is only retained for backwards
- compatibility. It is undocumented and restrictive in the maximum size of JSON
- documents that can be encoded. Qt JSON types can be converted to Qt CBOR types,
- which can in turn be serialized into the CBOR binary format and vice versa. The
- CBOR format is a well-defined and less restrictive binary representation for a
- superset of JSON.
-
- \note Before Qt 5.15, the caller had to guarantee that \a data would not be
- deleted or modified as long as any QJsonDocument, QJsonObject or QJsonArray
- still referenced the data. From Qt 5.15 on, this is not necessary anymore.
-
- \sa rawData(), fromBinaryData(), isNull(), DataValidation, QCborValue
- */
-QJsonDocument QJsonDocument::fromRawData(const char *data, int size, DataValidation validation)
-{
- if (quintptr(data) & 3) {
- qWarning("QJsonDocument::fromRawData: data has to have 4 byte alignment");
- return QJsonDocument();
- }
-
- if (size < 0 || uint(size) < sizeof(QBinaryJsonPrivate::Header) + sizeof(QBinaryJsonPrivate::Base))
- return QJsonDocument();
-
- std::unique_ptr<QBinaryJsonPrivate::ConstData> binaryData
- = qt_make_unique<QBinaryJsonPrivate::ConstData>(data, size);
-
- return (validation == BypassValidation || binaryData->isValid())
- ? binaryData->toJsonDocument()
- : QJsonDocument();
-}
-
-/*!
- \deprecated
-
- Returns the raw binary representation of the data
- \a size will contain the size of the returned data.
-
- This method is useful to e.g. stream the JSON document
- in its binary form to a file.
-
- \note Deprecated in Qt 5.15. The binary JSON encoding is only retained for backwards
- compatibility. It is undocumented and restrictive in the maximum size of JSON
- documents that can be encoded. Qt JSON types can be converted to Qt CBOR types,
- which can in turn be serialized into the CBOR binary format and vice versa. The
- CBOR format is a well-defined and less restrictive binary representation for a
- superset of JSON.
-
- \sa QCborValue
- */
-const char *QJsonDocument::rawData(int *size) const
-{
- if (!d) {
- *size = 0;
- return nullptr;
- }
-
- if (!d->rawData) {
- if (isObject()) {
- QBinaryJsonObject o = QBinaryJsonObject::fromJsonObject(object());
- d->rawData = o.takeRawData(&(d->rawDataSize));
- } else {
- QBinaryJsonArray a = QBinaryJsonArray::fromJsonArray(array());
- d->rawData = a.takeRawData(&(d->rawDataSize));
- }
- }
-
- // It would be quite miraculous if not, as we should have hit the 128MB limit then.
- Q_ASSERT(d->rawDataSize <= uint(std::numeric_limits<int>::max()));
-
- *size = d->rawDataSize;
- return d->rawData;
-}
-
-/*!
- \deprecated
- Creates a QJsonDocument from \a data.
-
- \a validation decides whether the data is checked for validity before being used.
- By default the data is validated. If the \a data is not valid, the method returns
- a null document.
-
- \note Deprecated in Qt 5.15. The binary JSON encoding is only retained for backwards
- compatibility. It is undocumented and restrictive in the maximum size of JSON
- documents that can be encoded. Qt JSON types can be converted to Qt CBOR types,
- which can in turn be serialized into the CBOR binary format and vice versa. The
- CBOR format is a well-defined and less restrictive binary representation for a
- superset of JSON.
-
- \sa toBinaryData(), fromRawData(), isNull(), DataValidation, QCborValue
- */
-QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation)
-{
- if (uint(data.size()) < sizeof(QBinaryJsonPrivate::Header) + sizeof(QBinaryJsonPrivate::Base))
- return QJsonDocument();
-
- QBinaryJsonPrivate::Header h;
- memcpy(&h, data.constData(), sizeof(QBinaryJsonPrivate::Header));
- QBinaryJsonPrivate::Base root;
- memcpy(&root, data.constData() + sizeof(QBinaryJsonPrivate::Header),
- sizeof(QBinaryJsonPrivate::Base));
-
- const uint size = sizeof(QBinaryJsonPrivate::Header) + root.size;
- if (h.tag != QJsonDocument::BinaryFormatTag || h.version != 1U || size > uint(data.size()))
- return QJsonDocument();
-
- std::unique_ptr<QBinaryJsonPrivate::ConstData> d
- = qt_make_unique<QBinaryJsonPrivate::ConstData>(data.constData(), size);
-
- return (validation == BypassValidation || d->isValid())
- ? d->toJsonDocument()
- : QJsonDocument();
-}
-
-/*!
- \deprecated
- Returns a binary representation of the document.
-
- The binary representation is also the native format used internally in Qt,
- and is very efficient and fast to convert to and from.
-
- The binary format can be stored on disk and interchanged with other applications
- or computers. fromBinaryData() can be used to convert it back into a
- JSON document.
-
- \note Deprecated in Qt 5.15. The binary JSON encoding is only retained for backwards
- compatibility. It is undocumented and restrictive in the maximum size of JSON
- documents that can be encoded. Qt JSON types can be converted to Qt CBOR types,
- which can in turn be serialized into the CBOR binary format and vice versa. The
- CBOR format is a well-defined and less restrictive binary representation for a
- superset of JSON.
-
- \sa fromBinaryData(), QCborValue
- */
-QByteArray QJsonDocument::toBinaryData() const
-{
- int size = 0;
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- const char *raw = rawData(&size);
-QT_WARNING_POP
- return QByteArray(raw, size);
-}
-#endif // QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15)
-
+#ifndef QT_NO_VARIANT
/*!
Creates a QJsonDocument from the QVariant \a variant.
@@ -411,7 +196,7 @@ QJsonDocument QJsonDocument::fromVariant(const QVariant &variant)
{
QJsonDocument doc;
- switch (variant.userType()) {
+ switch (variant.metaType().id()) {
case QMetaType::QVariantMap:
doc.setObject(QJsonObject::fromVariantMap(variant.toMap()));
break;
@@ -422,7 +207,7 @@ QJsonDocument QJsonDocument::fromVariant(const QVariant &variant)
doc.setArray(QJsonArray::fromVariantList(variant.toList()));
break;
case QMetaType::QStringList:
- doc.d = qt_make_unique<QJsonDocumentPrivate>();
+ doc.d = std::make_unique<QJsonDocumentPrivate>();
doc.d->value = QCborArray::fromStringList(variant.toStringList());
break;
default:
@@ -449,18 +234,7 @@ QVariant QJsonDocument::toVariant() const
return QJsonArray(container).toVariantList();
return QJsonObject(container).toVariantMap();
}
-
-/*!
- Converts the QJsonDocument to an indented, UTF-8 encoded JSON document.
-
- \sa fromJson()
- */
-#if !defined(QT_JSON_READONLY) || defined(Q_CLANG_QDOC)
-QByteArray QJsonDocument::toJson() const
-{
- return toJson(Indented);
-}
-#endif
+#endif // !QT_NO_VARIANT
/*!
\enum QJsonDocument::JsonFormat
@@ -482,7 +256,7 @@ QByteArray QJsonDocument::toJson() const
\sa fromJson(), JsonFormat
*/
-#if !defined(QT_JSON_READONLY) || defined(Q_CLANG_QDOC)
+#if !defined(QT_JSON_READONLY) || defined(Q_QDOC)
QByteArray QJsonDocument::toJson(JsonFormat format) const
{
QByteArray json;
@@ -511,11 +285,11 @@ QByteArray QJsonDocument::toJson(JsonFormat format) const
*/
QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error)
{
- QJsonPrivate::Parser parser(json.constData(), json.length());
+ QJsonPrivate::Parser parser(json.constData(), json.size());
QJsonDocument result;
const QCborValue val = parser.parse(error);
if (val.isArray() || val.isMap()) {
- result.d = qt_make_unique<QJsonDocumentPrivate>();
+ result.d = std::make_unique<QJsonDocumentPrivate>();
result.d->value = val;
}
return result;
@@ -600,7 +374,7 @@ QJsonArray QJsonDocument::array() const
void QJsonDocument::setObject(const QJsonObject &object)
{
if (!d)
- d = qt_make_unique<QJsonDocumentPrivate>();
+ d = std::make_unique<QJsonDocumentPrivate>();
else
d->clearRawData();
@@ -615,14 +389,13 @@ void QJsonDocument::setObject(const QJsonObject &object)
void QJsonDocument::setArray(const QJsonArray &array)
{
if (!d)
- d = qt_make_unique<QJsonDocumentPrivate>();
+ d = std::make_unique<QJsonDocumentPrivate>();
else
d->clearRawData();
d->value = QCborValue::fromJsonValue(array);
}
-#if QT_STRINGVIEW_LEVEL < 2
/*!
Returns a QJsonValue representing the value for the key \a key.
@@ -639,7 +412,6 @@ const QJsonValue QJsonDocument::operator[](const QString &key) const
{
return (*this)[QStringView(key)];
}
-#endif
/*!
\overload
@@ -657,7 +429,7 @@ const QJsonValue QJsonDocument::operator[](QStringView key) const
\overload
\since 5.10
*/
-const QJsonValue QJsonDocument::operator[](QLatin1String key) const
+const QJsonValue QJsonDocument::operator[](QLatin1StringView key) const
{
if (!isObject())
return QJsonValue(QJsonValue::Undefined);
@@ -677,7 +449,7 @@ const QJsonValue QJsonDocument::operator[](QLatin1String key) const
\sa QJsonValue, QJsonValue::isUndefined(), QJsonArray
*/
-const QJsonValue QJsonDocument::operator[](int i) const
+const QJsonValue QJsonDocument::operator[](qsizetype i) const
{
if (!isArray())
return QJsonValue(QJsonValue::Undefined);
@@ -686,18 +458,22 @@ const QJsonValue QJsonDocument::operator[](int i) const
}
/*!
- Returns \c true if the \a other document is equal to this document.
- */
-bool QJsonDocument::operator==(const QJsonDocument &other) const
+ \fn bool QJsonDocument::operator==(const QJsonDocument &lhs, const QJsonDocument &rhs)
+
+ Returns \c true if the \a lhs document is equal to \a rhs document, \c false otherwise.
+*/
+bool comparesEqual(const QJsonDocument &lhs, const QJsonDocument &rhs) noexcept
{
- return (!d) ? (!other.d) : (d->value == other.d->value);
+ if (lhs.d && rhs.d)
+ return lhs.d->value == rhs.d->value;
+ return !lhs.d == !rhs.d;
}
/*!
- \fn bool QJsonDocument::operator!=(const QJsonDocument &other) const
+ \fn bool QJsonDocument::operator!=(const QJsonDocument &lhs, const QJsonDocument &rhs)
- returns \c true if \a other is not equal to this document
- */
+ Returns \c true if the \a lhs document is not equal to \a rhs document, \c false otherwise.
+*/
/*!
returns \c true if this document is null.