6 #ifndef SWIFT_MISC_MIXIN_MIXINJSON_H
7 #define SWIFT_MISC_MIXIN_MIXINJSON_H
12 #include <QJsonDocument>
13 #include <QJsonObject>
15 #include <QJsonValueRef>
35 template <
class Derived>
40 friend const QJsonObject &
operator>>(
const QJsonObject &json, Derived &obj)
42 obj.convertFromJson(json);
47 friend const QJsonValue &
operator>>(
const QJsonValue &json, Derived &obj)
49 obj.convertFromJson(json.toObject());
54 friend QJsonValueRef
operator>>(QJsonValueRef json, Derived &obj)
56 obj.convertFromJson(json.toObject());
61 friend QJsonArray &
operator<<(QJsonArray &json,
const Derived &obj)
63 json.append(obj.toJson());
68 friend QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const Derived &> &value)
70 json.insert(value.first, QJsonValue(value.second.toJson()));
76 const std::pair<CExplicitLatin1String, const Derived &> &value)
78 json[value.first] = QJsonValue(value.second.toJson());
88 template <
class Derived>
96 QString
toJsonString(QJsonDocument::JsonFormat format = QJsonDocument::Indented)
const;
105 template <
class DerivedObj = Derived>
106 static DerivedObj
fromJson(
const QJsonObject &json);
109 template <
class DerivedObj = Derived>
110 static DerivedObj
fromJson(
const QString &jsonString,
bool acceptCacheJson =
false);
113 template <
class DerivedObj = Derived>
114 static DerivedObj
fromJsonNoThrow(
const QString &jsonString,
bool acceptCacheJson,
bool &success,
118 const Derived *derived()
const;
121 template <
typename T>
122 static QJsonObject baseToJson(
const T *base);
123 template <
typename T>
124 static void baseConvertFromJson(T *base,
const QJsonObject &json);
125 static QJsonObject baseToJson(
const void *);
126 static void baseConvertFromJson(
void *,
const QJsonObject &);
127 static QJsonObject baseToJson(
const CEmpty *);
128 static void baseConvertFromJson(
CEmpty *,
const QJsonObject &);
131 template <
class Derived>
135 introspect<Derived>().forEachMember([&,
this](
auto member) {
139 std::cref(member.in(*this->derived())));
145 template <
class Derived>
148 QJsonDocument jsonDoc(toJson());
149 return jsonDoc.toJson(format);
152 template <
class Derived>
156 introspect<Derived>().forEachMember([&,
this](
auto member) {
160 if (value.isUndefined())
168 QLatin1String(
"Missing required member '%1'").arg(member.latin1Name()));
175 value >> member.in(*this->derived());
181 template <
class Derived>
185 convertFromJson(jsonObject);
188 template <
class Derived>
189 template <
class DerivedObj>
193 obj.convertFromJson(json);
197 template <
class Derived>
198 template <
class DerivedObj>
202 if (jsonString.isEmpty()) {
return obj; }
203 const QJsonObject jsonObj =
205 obj.convertFromJson(jsonObj);
209 template <
class Derived>
210 template <
class DerivedObj>
212 bool &success, QString &errMsg)
218 if (jsonString.isEmpty()) {
return obj; }
219 const QJsonObject jsonObj =
221 obj.convertFromJson(jsonObj);
226 errMsg = ex.
toString(
"JSON conversion");
231 template <
class Derived>
234 return static_cast<const Derived *
>(
this);
237 template <
class Derived>
238 Derived *JsonByMetaClass<Derived>::derived()
240 return static_cast<Derived *
>(
this);
243 template <
class Derived>
244 template <
typename T>
245 QJsonObject JsonByMetaClass<Derived>::baseToJson(
const T *base)
250 template <
class Derived>
251 template <
typename T>
252 void JsonByMetaClass<Derived>::baseConvertFromJson(T *base,
const QJsonObject &json)
254 base->convertFromJson(json);
257 template <
class Derived>
258 QJsonObject JsonByMetaClass<Derived>::baseToJson(
const void *)
263 template <
class Derived>
264 void JsonByMetaClass<Derived>::baseConvertFromJson(
void *,
const QJsonObject &)
267 template <
class Derived>
268 QJsonObject JsonByMetaClass<Derived>::baseToJson(
const CEmpty *)
273 template <
class Derived>
274 void JsonByMetaClass<Derived>::baseConvertFromJson(CEmpty *,
const QJsonObject &)
281 #define SWIFT_MISC_DECLARE_USING_MIXIN_JSON(DERIVED) \
282 using ::swift::misc::mixin::JsonByMetaClass<DERIVED>::toJson; \
283 using ::swift::misc::mixin::JsonByMetaClass<DERIVED>::convertFromJson;
Default base class for CValueObject.
Thrown when a convertFromJson method encounters an unrecoverable error in JSON data.
QString toString(const QString &prefix) const
As string info.
Pseudo-RAII pattern that tracks the current JSON value being converted.
CRTP class template which will generate marshalling operators for a derived class with its own marsha...
friend QJsonArray & operator<<(QJsonArray &json, const Derived &obj)
operator << for JSON
friend const QJsonValue & operator>>(const QJsonValue &json, Derived &obj)
operator >> for JSON
friend QJsonObject & operator<<(QJsonObject &json, const std::pair< CExplicitLatin1String, const Derived & > &value)
operator << for JSON
friend QJsonObject & operator<<(QJsonObject &json, const std::pair< QString, const Derived & > &value)
operator << for JSON
friend QJsonValueRef operator>>(QJsonValueRef json, Derived &obj)
operator >> for JSON
friend const QJsonObject & operator>>(const QJsonObject &json, Derived &obj)
operator >> for JSON
QJsonObject & appendJsonObject(QJsonObject &target, const QJsonObject &toBeAppended)
Append to first JSON object (concatenate)
QJsonObject jsonObjectFromString(const QString &json, bool acceptCacheFormat)
JSON Object from string.
Free functions in swift::misc.
typename TBaseOf< T >::type TBaseOfT
Alias for typename TBaseOf<T>::type.
Simple literal type containing a single QLatin1String.