KanoopCommonQt 2.1.1
Kanoop foundational Qt utility library
Loading...
Searching...
No Matches
serializablejsonlist.h
1/**
2 * @brief Template helpers for serializing and deserializing lists of JSON-capable objects.
3 */
4#ifndef SERIALIZABLEJSONLIST_H
5#define SERIALIZABLEJSONLIST_H
6#include <QJsonArray>
7#include <QList>
8#include "iserializabletojson.h"
9#include "ideserializablefromjson.h"
10
11/**
12 * @brief A QList subclass that serializes/deserializes its elements via ISerializableToJsonObject.
13 *
14 * @tparam T Element type; must derive from both ISerializableToJsonObject and
15 * IDeserializableFromJsonObject.
16 */
17template <typename T>
18class SerializableJsonList : public QList<T>
19{
20public:
21 /**
22 * @brief Serialize all elements to a QJsonArray.
23 *
24 * Each element's serializeToJsonObject() result is appended as a JSON object.
25 * @return QJsonArray containing one entry per element
26 */
27 QJsonArray serializeToJsonArray() const {
28 QJsonArray jsonArray;
29 static_assert(std::is_base_of<ISerializableToJsonObject, T>::value, "T not derived from ISerializableToJsonObject");
30 for(typename QList<T>::const_iterator it = this->constBegin();it != this->constEnd();it++) {
31 T item = *it;
33 QJsonObject obj = p->serializeToJsonObject();
34 jsonArray.append(obj);
35 }
36 return jsonArray;
37 }
38
39 /**
40 * @brief Populate this list by deserializing each element of a QJsonArray.
41 *
42 * Each array entry is passed to a default-constructed element's
43 * deserializeFromJsonObject() method.
44 * @param jsonArray Source JSON array
45 */
46 void deserializeFromJsonArray(const QJsonArray& jsonArray) {
47 static_assert(std::is_base_of<IDeserializableFromJsonObject, T>::value, "T not derived from IDeserializableFromJsonObject");
48 for(const QJsonValue& jsonValue : jsonArray) {
49 T item;
51 ptr->deserializeFromJsonObject(jsonValue.toObject());
52 this->append(item);
53 }
54 }
55};
56
57/**
58 * @brief A QList of QSharedPointer<T> that serializes/deserializes its elements via ISerializableToJsonObject.
59 *
60 * @tparam T Element type; must derive from both ISerializableToJsonObject and
61 * IDeserializableFromJsonObject.
62 */
63template <typename T>
64class SerializableJsonPtrList : public QList<QSharedPointer<T>>
65{
66public:
67 /**
68 * @brief Serialize all elements to a QJsonArray.
69 * @return QJsonArray containing one entry per element
70 */
71 QJsonArray serializeToJsonArray() const {
72 QJsonArray jsonArray;
73 static_assert(std::is_base_of<ISerializableToJsonObject, T>::value, "T not derived from ISerializableToJsonObject");
74 for(typename QList<QSharedPointer<T>>::const_iterator it = this->constBegin();it != this->constEnd();it++) {
75 QSharedPointer<T> item = *it;
76 QSharedPointer<ISerializableToJsonObject> ptr = qSharedPointerCast<ISerializableToJsonObject>(item);
77 QJsonObject obj = ptr->serializeToJsonObject();
78 jsonArray.append(obj);
79 }
80 return jsonArray;
81 }
82
83 /**
84 * @brief Populate this list by deserializing each element of a QJsonArray.
85 * @param jsonArray Source JSON array
86 */
87 void deserializeFromJsonArray(const QJsonArray& jsonArray) {
88 static_assert(std::is_base_of<IDeserializableFromJsonObject, T>::value, "T not derived from IDeserializableFromJsonObject");
89 for(const QJsonValue& jsonValue : jsonArray) {
90 QSharedPointer<T> item(new T());
91 QSharedPointer<IDeserializableFromJsonObject> ptr = qSharedPointerCast<IDeserializableFromJsonObject>(item);
92 ptr->deserializeFromJsonObject(jsonValue.toObject());
93 this->append(item);
94 }
95 }
96};
97
98#endif // SERIALIZABLEJSONLIST_H
Interface for objects that can deserialize themselves from a QJsonObject.
virtual void deserializeFromJsonObject(const QJsonObject &jsonObject)=0
Populate this object from a QJsonObject.
Interface for objects that can serialize themselves into a QJsonObject, with JSON helper utilities.
virtual QJsonObject serializeToJsonObject() const =0
Serialize this object into a QJsonObject.
Template helpers for serializing and deserializing lists of JSON-capable objects.
QJsonArray serializeToJsonArray() const
Serialize all elements to a QJsonArray.
void deserializeFromJsonArray(const QJsonArray &jsonArray)
Populate this list by deserializing each element of a QJsonArray.
A QList of QSharedPointer<T> that serializes/deserializes its elements via ISerializableToJsonObject.
QJsonArray serializeToJsonArray() const
Serialize all elements to a QJsonArray.
void deserializeFromJsonArray(const QJsonArray &jsonArray)
Populate this list by deserializing each element of a QJsonArray.