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:
parent
bfbf8ca453
commit
89c4bb5f24
@ -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());
|
|
||||||
}
|
|
||||||
|
@ -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
|
||||||
|
@ -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).
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
|
@ -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");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user