swift
json.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2014 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #ifndef SWIFT_MISC_JSON_H
7 #define SWIFT_MISC_JSON_H
8 
9 #include <type_traits>
10 #include <utility>
11 
12 #include <QByteArray>
13 #include <QJsonArray>
14 #include <QJsonDocument>
15 #include <QJsonObject>
16 #include <QJsonValue>
17 #include <QJsonValueRef>
18 #include <QStringList>
19 #include <QtGlobal>
20 
21 #include "misc/fileutils.h"
22 #include "misc/metaclass.h"
23 #include "misc/swiftmiscexport.h"
24 
25 class QDateTime;
26 class QPixmap;
27 
35 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, int &value);
36 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, qlonglong &value);
37 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, qulonglong &value);
38 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, uint &value);
39 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, qint16 &value);
40 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, QString &value);
41 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, QStringList &value);
42 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, std::string &value);
43 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, double &value);
44 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, bool &value);
45 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, QDateTime &value);
46 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, QPixmap &value);
47 SWIFT_MISC_EXPORT const QJsonValue &operator>>(const QJsonValue &json, QByteArray &value);
48 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, int &value);
49 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, qlonglong &value);
50 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, qulonglong &value);
51 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, uint &value);
52 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, qint16 &value);
53 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, QString &value);
54 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, std::string &value);
55 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, QStringList &value);
56 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, double &value);
57 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, bool &value);
58 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, QDateTime &value);
59 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, QPixmap &value);
60 SWIFT_MISC_EXPORT QJsonValueRef operator>>(QJsonValueRef json, QByteArray &value);
61 
63 
68 template <class ENUM>
69 std::enable_if_t<std::is_enum_v<ENUM>, QJsonObject> &operator<<(QJsonObject &json,
70  std::pair<QString, const ENUM &> value)
71 {
72  json.insert(value.first, QJsonValue(static_cast<int>(value.second)));
73  return json;
74 }
75 template <class ENUM>
76 std::enable_if_t<std::is_enum_v<ENUM>, QJsonObject> &
77 operator<<(QJsonObject &json, std::pair<swift::misc::CExplicitLatin1String, const ENUM &> value)
78 {
79  json[value.first] = QJsonValue(static_cast<int>(value.second));
80  return json;
81 }
83 
87 template <class ENUM>
88 QJsonObject &operator<<(QJsonObject &json, std::pair<QString, const QFlags<ENUM> &> value)
89 {
90  json.insert(value.first, QJsonValue(static_cast<int>(value.second)));
91  return json;
92 }
93 template <class ENUM>
94 QJsonObject &operator<<(QJsonObject &json, std::pair<swift::misc::CExplicitLatin1String, const QFlags<ENUM> &> value)
95 {
96  json[value.first] = QJsonValue(static_cast<int>(value.second));
97  return json;
98 }
100 
103 template <class ENUM>
104 std::enable_if_t<std::is_enum_v<ENUM>, QJsonValue> const &operator>>(const QJsonValue &json, ENUM &value)
105 {
106  value = static_cast<ENUM>(json.toInt());
107  return json;
108 }
109 
112 template <class ENUM>
113 const QJsonValue &operator>>(const QJsonValue &json, QFlags<ENUM> &value)
114 {
115  value = static_cast<QFlags<ENUM>>(json.toInt());
116  return json;
117 }
118 
121 template <class ENUM, typename = std::enable_if_t<std::is_enum_v<ENUM>>>
122 QJsonValueRef operator>>(QJsonValueRef json, ENUM &value)
123 {
124  value = static_cast<ENUM>(json.toInt());
125  return json;
126 }
127 
130 template <class ENUM>
131 QJsonValueRef operator>>(QJsonValueRef json, QFlags<ENUM> &value)
132 {
133  value = static_cast<QFlags<ENUM>>(json.toInt());
134  return json;
135 }
136 
139 template <class FIRST, class SECOND>
140 QJsonValueRef operator>>(QJsonValueRef json, std::pair<FIRST, SECOND> &pair)
141 {
142  json.toArray() >> pair.first >> pair.second;
143  return json;
144 }
145 
148 template <class FIRST, class SECOND>
149 QJsonArray &operator<<(QJsonArray &json, const std::pair<FIRST, SECOND> &pair)
150 {
151  QJsonArray array;
152  return json << QJsonValue(array << pair.first << pair.second);
153 }
154 
158 SWIFT_MISC_EXPORT QJsonArray &operator<<(QJsonArray &json, const int value);
159 SWIFT_MISC_EXPORT QJsonArray &operator<<(QJsonArray &json, const std::pair<QString, qint16> &value);
160 SWIFT_MISC_EXPORT QJsonArray &operator<<(QJsonArray &json, const qlonglong value);
161 SWIFT_MISC_EXPORT QJsonArray &operator<<(QJsonArray &json, const uint value);
162 SWIFT_MISC_EXPORT QJsonArray &operator<<(QJsonArray &json, const qulonglong value);
163 SWIFT_MISC_EXPORT QJsonArray &operator<<(QJsonArray &json, const QString &value);
164 SWIFT_MISC_EXPORT QJsonArray &operator<<(QJsonArray &json, const std::string &value);
165 SWIFT_MISC_EXPORT QJsonArray &operator<<(QJsonArray &json, const double value);
166 SWIFT_MISC_EXPORT QJsonArray &operator<<(QJsonArray &json, const bool value);
167 SWIFT_MISC_EXPORT QJsonArray &operator<<(QJsonArray &json, const QDateTime &value);
168 SWIFT_MISC_EXPORT QJsonArray &operator<<(QJsonArray &json, const QPixmap &value);
169 SWIFT_MISC_EXPORT QJsonArray &operator<<(QJsonArray &json, const QByteArray &value);
171 
175 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const int &> &value);
176 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const qint16 &> &value);
177 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const qlonglong &> &value);
178 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const uint &> &value);
179 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const qulonglong &> &value);
180 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const QString &> &value);
181 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const std::string &> &value);
182 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const QStringList &> &value);
183 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const double &> &value);
184 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const bool &> &value);
185 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const QDateTime &> &value);
186 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const QPixmap &> &value);
187 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json, const std::pair<QString, const QByteArray &> &value);
188 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json,
189  const std::pair<swift::misc::CExplicitLatin1String, const int &> &value);
190 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json,
191  const std::pair<swift::misc::CExplicitLatin1String, const qint16 &> &value);
192 SWIFT_MISC_EXPORT QJsonObject &
193 operator<<(QJsonObject &json, const std::pair<swift::misc::CExplicitLatin1String, const qlonglong &> &value);
194 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json,
195  const std::pair<swift::misc::CExplicitLatin1String, const uint &> &value);
196 SWIFT_MISC_EXPORT QJsonObject &
197 operator<<(QJsonObject &json, const std::pair<swift::misc::CExplicitLatin1String, const qulonglong &> &value);
198 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json,
199  const std::pair<swift::misc::CExplicitLatin1String, const QString &> &value);
200 SWIFT_MISC_EXPORT QJsonObject &
201 operator<<(QJsonObject &json, const std::pair<swift::misc::CExplicitLatin1String, const std::string &> &value);
202 SWIFT_MISC_EXPORT QJsonObject &
203 operator<<(QJsonObject &json, const std::pair<swift::misc::CExplicitLatin1String, const QStringList &> &value);
204 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json,
205  const std::pair<swift::misc::CExplicitLatin1String, const double &> &value);
206 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json,
207  const std::pair<swift::misc::CExplicitLatin1String, const bool &> &value);
208 SWIFT_MISC_EXPORT QJsonObject &
209 operator<<(QJsonObject &json, const std::pair<swift::misc::CExplicitLatin1String, const QDateTime &> &value);
210 SWIFT_MISC_EXPORT QJsonObject &operator<<(QJsonObject &json,
211  const std::pair<swift::misc::CExplicitLatin1String, const QPixmap &> &value);
212 SWIFT_MISC_EXPORT QJsonObject &
213 operator<<(QJsonObject &json, const std::pair<swift::misc::CExplicitLatin1String, const QByteArray &> &value);
215 
219 QDataStream &operator<<(QDataStream &s, const std::string &v);
220 QDataStream &operator>>(QDataStream &s, std::string &v);
222 
223 namespace swift::misc::json
224 {
227  SWIFT_MISC_EXPORT QJsonObject &appendJsonObject(QJsonObject &target, const QJsonObject &toBeAppended);
228 
231  SWIFT_MISC_EXPORT QJsonObject jsonObjectFromString(const QString &json, bool acceptCacheFormat = false);
232 
235  SWIFT_MISC_EXPORT QString stringFromJsonObject(const QJsonObject &jsonObject,
236  QJsonDocument::JsonFormat format = QJsonDocument::Indented);
237 
240  SWIFT_MISC_EXPORT QJsonArray jsonArrayFromString(const QString &json);
241 
243  SWIFT_MISC_EXPORT QString firstJsonValueAsString(const QString &json);
244 
246  SWIFT_MISC_EXPORT QString firstJsonValueAsString(const QJsonObject &json);
247 
249  SWIFT_MISC_EXPORT int firstJsonValueAsInt(const QString &json, int defaultValue = -1, bool *ok = nullptr);
250 
252  SWIFT_MISC_EXPORT int firstJsonValueAsInt(const QJsonObject &json, int defaultValue = -1, bool *ok = nullptr);
253 
255  SWIFT_MISC_EXPORT QStringList firstJsonValueAsStringList(const QString &json);
256 
258  SWIFT_MISC_EXPORT QStringList firstJsonValueAsStringList(const QJsonObject &json);
259 
261  SWIFT_MISC_EXPORT QStringList arrayToQStringList(const QJsonArray &array);
262 
264  SWIFT_MISC_EXPORT QJsonObject getIncrementalObject(const QJsonObject &previousObject,
265  const QJsonObject &currentObject);
266 
268  SWIFT_MISC_EXPORT QJsonObject applyIncrementalObject(const QJsonObject &previousObject,
269  const QJsonObject &incrementalObject);
270 
273  SWIFT_MISC_EXPORT bool looksLikeJson(const QString &json);
274 
277  SWIFT_MISC_EXPORT bool looksLikeSwiftJson(const QString &json);
278 
280  SWIFT_MISC_EXPORT bool looksLikeSwiftContainerJson(const QJsonObject &object);
281 
283  SWIFT_MISC_EXPORT bool looksLikeSwiftDataObjectJson(const QJsonObject &object);
284 
286  SWIFT_MISC_EXPORT bool looksLikeSwiftTypeValuePairJson(const QJsonObject &object);
287 
289  SWIFT_MISC_EXPORT bool looksLikeSwiftDbJson(const QJsonObject &object);
290 
294  SWIFT_MISC_EXPORT QJsonObject swiftDataObjectValue(const QJsonObject &object);
295 
299  SWIFT_MISC_EXPORT QJsonObject swiftDataObjectValue(const QString &jsonString);
300 
304  SWIFT_MISC_EXPORT QJsonObject unwrapCache(const QJsonObject &object);
305 
309  SWIFT_MISC_EXPORT QJsonObject unwrapCache(const QString &jsonString);
310 
314  template <class T>
315  bool loadFromJsonFile(T &object, const QString &fileNameAndPath, bool acceptCacheFormat = false)
316  {
317  const QString jsonString(CFileUtils::readFileToString(fileNameAndPath));
318  if (jsonString.isEmpty()) { return false; }
319  object.convertFromJson(jsonString, acceptCacheFormat);
320  return true;
321  }
322 
326  template <class T>
327  bool saveToJsonFile(const T &object, const QString &fileNameAndPath)
328  {
329  const QString jsonString(object.toJsonString());
330  if (jsonString.isEmpty()) { return false; }
331  return CFileUtils::writeStringToFile(jsonString, fileNameAndPath);
332  }
333 } // namespace swift::misc::json
334 
335 #endif // SWIFT_MISC_JSON_H
static bool writeStringToFile(const QString &content, const QString &fileNameAndPath)
Write string to text file.
Definition: fileutils.cpp:40
static QString readFileToString(const QString &fileNameAndPath)
Read file into string.
Definition: fileutils.cpp:68
QString stringFromJsonObject(const QJsonObject &jsonObject, QJsonDocument::JsonFormat format)
JSON Object from string.
Definition: json.cpp:424
std::enable_if_t< std::is_enum_v< ENUM >, QJsonObject > & operator<<(QJsonObject &json, std::pair< QString, const ENUM & > value)
Specialized JSON serialization for enum.
Definition: json.h:69
QJsonObject & appendJsonObject(QJsonObject &target, const QJsonObject &toBeAppended)
Append to first JSON object (concatenate)
Definition: json.cpp:438
QJsonObject jsonObjectFromString(const QString &json, bool acceptCacheFormat)
JSON Object from string.
Definition: json.cpp:413
QJsonArray jsonArrayFromString(const QString &json)
JSON Array from string.
Definition: json.cpp:431
SWIFT_MISC_EXPORT const QJsonValue & operator>>(const QJsonValue &json, int &value)
Streaming operators for QJsonValue (to value)
Definition: json.cpp:18
bool loadFromJsonFile(T &object, const QString &fileNameAndPath, bool acceptCacheFormat=false)
Load JSON file and init by that.
Definition: json.h:315
bool saveToJsonFile(const T &object, const QString &fileNameAndPath)
Save to JSON file.
Definition: json.h:327
Simple literal type containing a single QLatin1String.
Definition: metaclass.h:102
#define SWIFT_MISC_EXPORT
Export a class or function from the library.