jsonserializer.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "jsonserializer.h"
  2. #include "jsonserializer_p.h"
  3. #include <QtCore/QBuffer>
  4. using namespace QtJsonSerializer;
  5. JsonSerializer::JsonSerializer(QObject *parent) :
  6. SerializerBase{*new JsonSerializerPrivate{}, parent}
  7. {}
  8. QJsonValue JsonSerializer::serialize(const QVariant &data) const
  9. {
  10. return serializeVariant(data.userType(), data).toJsonValue();
  11. }
  12. void JsonSerializer::serializeTo(QIODevice *device, const QVariant &data, QJsonDocument::JsonFormat format) const
  13. {
  14. if (!device->isOpen() || !device->isWritable())
  15. throw SerializationException{"QIODevice must be open and writable!"};
  16. QJsonDocument doc;
  17. const auto jData = serialize(data);
  18. if (jData.isArray())
  19. doc = QJsonDocument{jData.toArray()};
  20. else if (jData.isObject())
  21. doc = QJsonDocument{jData.toObject()};
  22. else
  23. throw SerializationException{"Only objects or arrays can be written to a device!"};
  24. device->write(doc.toJson(format));
  25. }
  26. QByteArray JsonSerializer::serializeTo(const QVariant &data, QJsonDocument::JsonFormat format) const
  27. {
  28. QBuffer buffer;
  29. if (!buffer.open(QIODevice::WriteOnly))
  30. throw SerializationException{"Failed to write to bytearray buffer with error: " + buffer.errorString().toUtf8()};
  31. serializeTo(&buffer, data, format);
  32. buffer.close();
  33. return buffer.data();
  34. }
  35. QVariant JsonSerializer::deserialize(const QJsonValue &json, int metaTypeId, QObject *parent) const
  36. {
  37. return deserializeVariant(metaTypeId, QCborValue::fromJsonValue(json), parent);
  38. }
  39. QVariant JsonSerializer::deserializeFrom(QIODevice *device, int metaTypeId, QObject *parent) const
  40. {
  41. if (!device->isOpen() || !device->isReadable())
  42. throw DeserializationException{"QIODevice must be open and readable!"};
  43. QJsonParseError error;
  44. auto doc = QJsonDocument::fromJson(device->readAll(), &error);
  45. if (error.error != QJsonParseError::NoError)
  46. throw DeserializationException{"Failed to read file as JSON with error: " + error.errorString().toUtf8()};
  47. if (doc.isArray())
  48. return deserialize(doc.array(), metaTypeId, parent);
  49. else if (doc.isObject())
  50. return deserialize(doc.object(), metaTypeId, parent);
  51. else if (doc.isNull())
  52. return deserialize(QJsonValue::Null, metaTypeId, parent);
  53. else
  54. return QVariant{};
  55. }
  56. QVariant JsonSerializer::deserializeFrom(const QByteArray &data, int metaTypeId, QObject *parent) const
  57. {
  58. QBuffer buffer(const_cast<QByteArray*>(&data));
  59. if (!buffer.open(QIODevice::ReadOnly))
  60. throw DeserializationException{"Failed to read from bytearray buffer with error: " + buffer.errorString().toUtf8()};
  61. auto res = deserializeFrom(&buffer, metaTypeId, parent);
  62. buffer.close();
  63. return res;
  64. }
  65. JsonSerializer::ByteArrayFormat JsonSerializer::byteArrayFormat() const
  66. {
  67. Q_D(const JsonSerializer);
  68. return d->byteArrayFormat;
  69. }
  70. bool JsonSerializer::validateBase64() const
  71. {
  72. Q_D(const JsonSerializer);
  73. return d->validateBase64;
  74. }
  75. std::variant<QCborValue, QJsonValue> JsonSerializer::serializeGeneric(const QVariant &value) const
  76. {
  77. return serialize(value);
  78. }
  79. QVariant JsonSerializer::deserializeGeneric(const std::variant<QCborValue, QJsonValue> &value, int metaTypeId, QObject *parent) const
  80. {
  81. return deserialize(std::get<QJsonValue>(value), metaTypeId, parent);
  82. }
  83. void JsonSerializer::setByteArrayFormat(JsonSerializer::ByteArrayFormat byteArrayFormat)
  84. {
  85. Q_D(JsonSerializer);
  86. if(d->byteArrayFormat == byteArrayFormat)
  87. return;
  88. d->byteArrayFormat = byteArrayFormat;
  89. emit byteArrayFormatChanged(d->byteArrayFormat, {});
  90. }
  91. void JsonSerializer::setValidateBase64(bool validateBase64)
  92. {
  93. Q_D(JsonSerializer);
  94. if(d->validateBase64 == validateBase64)
  95. return;
  96. d->validateBase64 = validateBase64;
  97. emit validateBase64Changed(d->validateBase64, {});
  98. }
  99. bool JsonSerializer::jsonMode() const
  100. {
  101. return true;
  102. }
  103. QCborTag JsonSerializer::typeTag(int metaTypeId) const
  104. {
  105. Q_D(const JsonSerializer);
  106. if (metaTypeId == QMetaType::QByteArray) {
  107. switch (d->byteArrayFormat) {
  108. case ByteArrayFormat::Base64:
  109. return static_cast<QCborTag>(QCborKnownTags::ExpectedBase64);
  110. case ByteArrayFormat::Base64url:
  111. return static_cast<QCborTag>(QCborKnownTags::ExpectedBase64url);
  112. case ByteArrayFormat::Base16:
  113. return static_cast<QCborTag>(QCborKnownTags::ExpectedBase16);
  114. default:
  115. Q_UNREACHABLE();
  116. }
  117. } else
  118. return TypeConverter::NoTag;
  119. }
  120. QList<int> JsonSerializer::typesForTag(QCborTag tag) const
  121. {
  122. Q_UNUSED(tag)
  123. return {};
  124. }