diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index dbc11c57ec5..29e57c659d3 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(data); break; + case QMetaType::QJsonDocument: + stream << *static_cast(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(data); break; + case QMetaType::QJsonDocument: + stream >> *static_cast(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 5018f7c2676..5647b771fbc 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 b784890c544..a749439b7d8 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 2d6961c209e..4a027474a88 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 4651258ef35..713c69149b6 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("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"