Deprecate QJsonDocument methods for converting to/from JSON binary

Also remove the example code for deprecated methods and use CBOR instead
where it makes sense.

Task-number: QTBUG-81068
Change-Id: Iffb7a4b3d7b16a1e485fc05b3ab2e2468e9e0718
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
Sona Kurazyan 2020-01-08 13:43:54 +01:00
parent bfbf8ca453
commit 89c4bb5f24
7 changed files with 31 additions and 88 deletions

View File

@ -57,7 +57,6 @@
#include <QJsonValue> #include <QJsonValue>
static JsonConverter jsonConverter; static JsonConverter jsonConverter;
static BinaryJsonConverter BinaryJsonConverter;
static const char optionHelp[] = static const char optionHelp[] =
"compact=no|yes Use compact JSON form.\n"; "compact=no|yes Use compact JSON form.\n";
@ -151,62 +150,3 @@ void JsonConverter::saveFile(QIODevice *f, const QVariant &contents, const QStri
f->write(convertFromVariant(contents).toJson(format)); f->write(convertFromVariant(contents).toJson(format));
} }
QString BinaryJsonConverter::name()
{
return "binary-json";
}
Converter::Direction BinaryJsonConverter::directions()
{
return InOut;
}
Converter::Options BinaryJsonConverter::outputOptions()
{
return {};
}
const char *BinaryJsonConverter::optionsHelp()
{
return nullptr;
}
bool BinaryJsonConverter::probeFile(QIODevice *f)
{
return f->isReadable() && f->peek(4) == "qbjs";
}
QVariant BinaryJsonConverter::loadFile(QIODevice *f, Converter *&outputConverter)
{
if (!outputConverter)
outputConverter = &jsonConverter;
QJsonDocument doc;
if (auto file = qobject_cast<QFile *>(f)) {
uchar *ptr = file->map(0, file->size());
if (ptr)
doc = QJsonDocument::fromRawData(reinterpret_cast<char *>(ptr), file->size());
}
if (doc.isNull())
doc = QJsonDocument::fromBinaryData(f->readAll());
if (!doc.isObject() && !doc.isArray()) {
fprintf(stderr, "Failed to load Binary JSON.\n");
exit(EXIT_FAILURE);
}
if (outputConverter == null)
return QVariant();
return doc.toVariant();
}
void BinaryJsonConverter::saveFile(QIODevice *f, const QVariant &contents, const QStringList &options)
{
if (!options.isEmpty()) {
fprintf(stderr, "Unknown option '%s' to JSON output. This format has no options.\n", qPrintable(options.first()));
exit(EXIT_FAILURE);
}
f->write(convertFromVariant(contents).toBinaryData());
}

View File

@ -69,17 +69,4 @@ public:
void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) override; void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) override;
}; };
class BinaryJsonConverter : public Converter
{
// Converter interface
public:
QString name() override;
Direction directions() override;
Options outputOptions() override;
const char *optionsHelp() override;
bool probeFile(QIODevice *f) override;
QVariant loadFile(QIODevice *f, Converter *&outputConverter) override;
void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) override;
};
#endif // JSONCONVERTER_H #endif // JSONCONVERTER_H

View File

@ -37,8 +37,8 @@
game generally involves serializing each game object's member variables game generally involves serializing each game object's member variables
to a file. Many formats can be used for this purpose, one of which is JSON. to a file. Many formats can be used for this purpose, one of which is JSON.
With QJsonDocument, you also have the ability to serialize a document in a With QJsonDocument, you also have the ability to serialize a document in a
binary format, which is great if you don't want the save file to be \l {https://tools.ietf.org/html/rfc7049} {CBOR} format, which is great if you
readable, or if you need to keep the file size down. don't want the save file to be readable, or if you need to keep the file size down.
In this example, we'll demonstrate how to save and load a simple game to In this example, we'll demonstrate how to save and load a simple game to
and from JSON and binary formats. and from JSON and binary formats.
@ -133,7 +133,7 @@
When loading a saved game in loadGame(), the first thing we do is open the When loading a saved game in loadGame(), the first thing we do is open the
save file based on which format it was saved to; \c "save.json" for JSON, save file based on which format it was saved to; \c "save.json" for JSON,
and \c "save.dat" for binary. We print a warning and return \c false if the and \c "save.dat" for CBOR. We print a warning and return \c false if the
file couldn't be opened. file couldn't be opened.
Since QJsonDocument's \l{QJsonDocument::fromJson()}{fromJson()} and Since QJsonDocument's \l{QJsonDocument::fromJson()}{fromJson()} and
@ -172,7 +172,7 @@
\snippet serialization/savegame/main.cpp 1 \snippet serialization/savegame/main.cpp 1
When the player has finished, we save their game. For demonstration When the player has finished, we save their game. For demonstration
purposes, we can serialize to either JSON or binary. You can examine the purposes, we can serialize to either JSON or CBOR. You can examine the
contents of the files in the same directory as the executable (or re-run contents of the files in the same directory as the executable (or re-run
the example, making sure to also specify the "load" option), although the the example, making sure to also specify the "load" option), although the
binary save file will contain some garbage characters (which is normal). binary save file will contain some garbage characters (which is normal).

View File

@ -50,6 +50,8 @@
#include "game.h" #include "game.h"
#include <QCborMap>
#include <QCborValue>
#include <QFile> #include <QFile>
#include <QJsonArray> #include <QJsonArray>
#include <QJsonDocument> #include <QJsonDocument>
@ -122,14 +124,14 @@ bool Game::loadGame(Game::SaveFormat saveFormat)
QJsonDocument loadDoc(saveFormat == Json QJsonDocument loadDoc(saveFormat == Json
? QJsonDocument::fromJson(saveData) ? QJsonDocument::fromJson(saveData)
: QJsonDocument::fromBinaryData(saveData)); : QJsonDocument(QCborValue::fromCbor(saveData).toMap().toJsonObject()));
read(loadDoc.object()); read(loadDoc.object());
QTextStream(stdout) << "Loaded save for " QTextStream(stdout) << "Loaded save for "
<< loadDoc["player"]["name"].toString() << loadDoc["player"]["name"].toString()
<< " using " << " using "
<< (saveFormat != Json ? "binary " : "") << "JSON...\n"; << (saveFormat != Json ? "CBOR" : "JSON") << "...\n";
return true; return true;
} }
//! [3] //! [3]
@ -148,10 +150,9 @@ bool Game::saveGame(Game::SaveFormat saveFormat) const
QJsonObject gameObject; QJsonObject gameObject;
write(gameObject); write(gameObject);
QJsonDocument saveDoc(gameObject);
saveFile.write(saveFormat == Json saveFile.write(saveFormat == Json
? saveDoc.toJson() ? QJsonDocument(gameObject).toJson()
: saveDoc.toBinaryData()); : QCborValue::fromJsonValue(gameObject).toCbor());
return true; return true;
} }

View File

@ -237,7 +237,7 @@ QJsonDocument &QJsonDocument::operator =(const QJsonDocument &other)
the application. the application.
*/ */
#if QT_CONFIG(binaryjson) #if QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15)
/*! /*!
Creates a QJsonDocument that uses the first \a size bytes from Creates a QJsonDocument that uses the first \a size bytes from
\a data. It assumes \a data contains a binary encoded JSON document. \a data. It assumes \a data contains a binary encoded JSON document.
@ -385,10 +385,13 @@ QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidati
QByteArray QJsonDocument::toBinaryData() const QByteArray QJsonDocument::toBinaryData() const
{ {
int size = 0; int size = 0;
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
const char *raw = rawData(&size); const char *raw = rawData(&size);
QT_WARNING_POP
return QByteArray(raw, size); return QByteArray(raw, size);
} }
#endif // QT_CONFIG(binaryjson) #endif // QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15)
/*! /*!
Creates a QJsonDocument from the QVariant \a variant. Creates a QJsonDocument from the QVariant \a variant.

View File

@ -111,13 +111,19 @@ public:
BypassValidation BypassValidation
}; };
#if QT_CONFIG(binaryjson) #if QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15)
QT_DEPRECATED_X("Use CBOR format instead")
static QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate); static QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate);
QT_DEPRECATED_X("Use CBOR format instead")
const char *rawData(int *size) const; const char *rawData(int *size) const;
QT_DEPRECATED_X("Use CBOR format instead")
static QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate); static QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
QT_DEPRECATED_X("Use CBOR format instead")
QByteArray toBinaryData() const; QByteArray toBinaryData() const;
#endif // QT_CONFIG(binaryjson) #endif // QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15)
static QJsonDocument fromVariant(const QVariant &variant); static QJsonDocument fromVariant(const QVariant &variant);
QVariant toVariant() const; QVariant toVariant() const;

View File

@ -342,8 +342,11 @@ bool QShaderDescription::isValid() const
*/ */
QByteArray QShaderDescription::toBinaryJson() const QByteArray QShaderDescription::toBinaryJson() const
{ {
#if QT_CONFIG(binaryjson) #if QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15)
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
return d->makeDoc().toBinaryData(); return d->makeDoc().toBinaryData();
QT_WARNING_POP
#else #else
qWarning("Cannot generate binary JSON from QShaderDescription due to disabled binaryjson feature"); qWarning("Cannot generate binary JSON from QShaderDescription due to disabled binaryjson feature");
return QByteArray(); return QByteArray();
@ -382,8 +385,11 @@ QByteArray QShaderDescription::toJson() const
QShaderDescription QShaderDescription::fromBinaryJson(const QByteArray &data) QShaderDescription QShaderDescription::fromBinaryJson(const QByteArray &data)
{ {
QShaderDescription desc; QShaderDescription desc;
#if QT_CONFIG(binaryjson) #if QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15)
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
QShaderDescriptionPrivate::get(&desc)->loadDoc(QJsonDocument::fromBinaryData(data)); QShaderDescriptionPrivate::get(&desc)->loadDoc(QJsonDocument::fromBinaryData(data));
QT_WARNING_POP
#else #else
Q_UNUSED(data); Q_UNUSED(data);
qWarning("Cannot load QShaderDescription from binary JSON due to disabled binaryjson feature"); qWarning("Cannot load QShaderDescription from binary JSON due to disabled binaryjson feature");