diff options
-rw-r--r-- | src/corelib/kernel/qmetatype.cpp | 8 | ||||
-rw-r--r-- | src/corelib/serialization/qjsondocument.cpp | 16 | ||||
-rw-r--r-- | src/corelib/serialization/qjsondocument.h | 5 | ||||
-rw-r--r-- | tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp | 1 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/json/tst_qtjson.cpp | 41 |
5 files changed, 68 insertions, 3 deletions
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index dbc11c57ec..29e57c659d 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -1416,7 +1416,6 @@ bool QMetaType::save(QDataStream &stream, int type, const void *data) case QMetaType::QJsonValue: case QMetaType::QJsonObject: case QMetaType::QJsonArray: - case QMetaType::QJsonDocument: case QMetaType::QCborValue: case QMetaType::QCborArray: case QMetaType::QCborMap: @@ -1561,6 +1560,9 @@ bool QMetaType::save(QDataStream &stream, int type, const void *data) case QMetaType::QCborSimpleType: stream << *static_cast<const quint8 *>(data); break; + case QMetaType::QJsonDocument: + stream << *static_cast<const NS(QJsonDocument)*>(data); + break; #endif // QT_BOOTSTRAPPED case QMetaType::QFont: case QMetaType::QPixmap: @@ -1648,7 +1650,6 @@ bool QMetaType::load(QDataStream &stream, int type, void *data) case QMetaType::QJsonValue: case QMetaType::QJsonObject: case QMetaType::QJsonArray: - case QMetaType::QJsonDocument: case QMetaType::QCborValue: case QMetaType::QCborArray: case QMetaType::QCborMap: @@ -1799,6 +1800,9 @@ bool QMetaType::load(QDataStream &stream, int type, void *data) case QMetaType::QCborSimpleType: stream >> *static_cast<quint8 *>(data); break; + case QMetaType::QJsonDocument: + stream >> *static_cast<NS(QJsonDocument)*>(data); + break; #endif // QT_BOOTSTRAPPED case QMetaType::QFont: case QMetaType::QPixmap: diff --git a/src/corelib/serialization/qjsondocument.cpp b/src/corelib/serialization/qjsondocument.cpp index 5018f7c267..5647b771fb 100644 --- a/src/corelib/serialization/qjsondocument.cpp +++ b/src/corelib/serialization/qjsondocument.cpp @@ -669,4 +669,20 @@ QDebug operator<<(QDebug dbg, const QJsonDocument &o) } #endif +#ifndef QT_NO_DATASTREAM +QDataStream &operator<<(QDataStream &stream, const QJsonDocument &doc) +{ + stream << doc.toJson(QJsonDocument::Compact); + return stream; +} + +QDataStream &operator>>(QDataStream &stream, QJsonDocument &doc) +{ + QByteArray buffer; + stream >> buffer; + doc = QJsonDocument::fromJson(buffer); + return stream; +} +#endif + QT_END_NAMESPACE diff --git a/src/corelib/serialization/qjsondocument.h b/src/corelib/serialization/qjsondocument.h index b784890c54..a749439b7d 100644 --- a/src/corelib/serialization/qjsondocument.h +++ b/src/corelib/serialization/qjsondocument.h @@ -172,6 +172,11 @@ Q_DECLARE_SHARED_NOT_MOVABLE_UNTIL_QT6(QJsonDocument) Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonDocument &); #endif +#ifndef QT_NO_DATASTREAM +Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QJsonDocument &); +Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QJsonDocument &); +#endif + QT_END_NAMESPACE #endif // QJSONDOCUMENT_H diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index 2d6961c209..4a027474a8 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -1824,7 +1824,6 @@ DECLARE_NONSTREAMABLE(QPersistentModelIndex) DECLARE_NONSTREAMABLE(QJsonValue) DECLARE_NONSTREAMABLE(QJsonObject) DECLARE_NONSTREAMABLE(QJsonArray) -DECLARE_NONSTREAMABLE(QJsonDocument) DECLARE_NONSTREAMABLE(QCborValue) DECLARE_NONSTREAMABLE(QCborArray) DECLARE_NONSTREAMABLE(QCborMap) diff --git a/tests/auto/corelib/serialization/json/tst_qtjson.cpp b/tests/auto/corelib/serialization/json/tst_qtjson.cpp index 4651258ef3..713c69149b 100644 --- a/tests/auto/corelib/serialization/json/tst_qtjson.cpp +++ b/tests/auto/corelib/serialization/json/tst_qtjson.cpp @@ -153,6 +153,10 @@ private Q_SLOTS: void implicitValueType(); void implicitDocumentType(); + void streamSerialization_data(); + void streamSerialization(); + void streamVariantSerialization(); + private: QString testDataDir; }; @@ -3011,5 +3015,42 @@ void tst_QtJson::implicitDocumentType() QCOMPARE(arrayDocument[-1].toInt(123), 123); } +void tst_QtJson::streamSerialization_data() +{ + QTest::addColumn<QJsonDocument>("document"); + QTest::newRow("empty") << QJsonDocument(); + QTest::newRow("object") << QJsonDocument(QJsonObject{{"value", 42}}); +} + +void tst_QtJson::streamSerialization() +{ + // Check interface only, implementation is tested through to and from + // json functions. + QByteArray buffer; + QFETCH(QJsonDocument, document); + QJsonDocument output; + QDataStream save(&buffer, QIODevice::WriteOnly); + save << document; + QDataStream load(buffer); + load >> output; + QCOMPARE(output, document); +} + +void tst_QtJson::streamVariantSerialization() +{ + // Check interface only, implementation is tested through to and from + // json functions. + QByteArray buffer; + QJsonDocument objectDoc(QJsonArray{665, 666, 667}); + QVariant output; + QVariant variant(objectDoc); + QDataStream save(&buffer, QIODevice::WriteOnly); + save << variant; + QDataStream load(buffer); + load >> output; + QCOMPARE(output.userType(), QMetaType::QJsonDocument); + QCOMPARE(output.toJsonDocument(), objectDoc); +} + QTEST_MAIN(tst_QtJson) #include "tst_qtjson.moc" |