Implement QJsonDocument data stream operators

Task-number: QTBUG-48313
Change-Id: I25ebeed94c9340819e925a7740bbee21de73a0ca
Reviewed-by: Luca Beldi <v.ronin@yahoo.it>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Jędrzej Nowacki 2018-08-21 10:35:30 +02:00
parent 98ec8bed19
commit cc24fc0406
5 changed files with 68 additions and 3 deletions

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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"