7 #include <QJsonDocument>
18 const QJsonValue &
operator>>(
const QJsonValue &json,
int &value)
24 const QJsonValue &
operator>>(
const QJsonValue &json, qlonglong &value)
26 value =
static_cast<qlonglong
>(json.toDouble());
30 const QJsonValue &
operator>>(
const QJsonValue &json, qulonglong &value)
32 value =
static_cast<qulonglong
>(json.toDouble());
36 const QJsonValue &
operator>>(
const QJsonValue &json, uint &value)
38 value =
static_cast<uint
>(json.toInt());
42 const QJsonValue &
operator>>(
const QJsonValue &json, qint16 &value)
44 value =
static_cast<qint16
>(json.toInt());
48 const QJsonValue &
operator>>(
const QJsonValue &json, QString &value)
50 value = json.toString();
54 const QJsonValue &
operator>>(
const QJsonValue &json, std::string &value)
56 value = json.toString().toStdString();
60 const QJsonValue &
operator>>(
const QJsonValue &json, QStringList &value)
62 for (
auto &&element : json.toArray()) { value << element.toString(); }
66 const QJsonValue &
operator>>(
const QJsonValue &json,
double &value)
68 value = json.toDouble();
72 const QJsonValue &
operator>>(
const QJsonValue &json,
bool &value)
74 value = json.toBool();
78 const QJsonValue &
operator>>(
const QJsonValue &json, QDateTime &value)
84 const QJsonValue &
operator>>(
const QJsonValue &json, QPixmap &value)
86 const QString hex(json.toString());
91 const QJsonValue &
operator>>(
const QJsonValue &json, QByteArray &value)
93 const QString hex(json.toString());
94 value = QByteArray::fromHex(hex.toLatin1());
100 value = json.toInt();
104 QJsonValueRef
operator>>(QJsonValueRef json, qlonglong &value)
106 value =
static_cast<qlonglong
>(json.toDouble());
110 QJsonValueRef
operator>>(QJsonValueRef json, qulonglong &value)
112 value =
static_cast<qulonglong
>(json.toDouble());
118 value =
static_cast<uint
>(json.toInt());
124 value =
static_cast<qint16
>(json.toInt());
130 value = json.toString();
134 QJsonValueRef
operator>>(QJsonValueRef json, std::string &value)
136 value = json.toString().toStdString();
140 QJsonValueRef
operator>>(QJsonValueRef json, QStringList &value)
142 for (
auto &&element : json.toArray()) { value << element.toString(); }
148 value = json.toDouble();
154 value = json.toBool();
158 QJsonValueRef
operator>>(QJsonValueRef json, QDateTime &value)
166 const QString hex(json.toString());
171 QJsonValueRef
operator>>(QJsonValueRef json, QByteArray &value)
173 const QString hex(json.toString());
174 value = QByteArray::fromHex(hex.toLatin1());
180 json.append(QJsonValue(value));
184 QJsonArray &
operator<<(QJsonArray &json,
const qint16 value)
186 json.append(QJsonValue(value));
190 QJsonArray &
operator<<(QJsonArray &json,
const qlonglong value)
192 json.append(QJsonValue(value));
198 json.append(QJsonValue(
static_cast<int>(value)));
202 QJsonArray &
operator<<(QJsonArray &json,
const qulonglong value)
204 json.append(QJsonValue(
static_cast<int>(value)));
208 QJsonArray &
operator<<(QJsonArray &json,
const QString &value)
210 json.append(QJsonValue(value));
214 QJsonArray &
operator<<(QJsonArray &json,
const std::string &value)
216 json.append(QJsonValue(QString::fromStdString(value)));
222 json.append(QJsonValue(value));
228 json.append(QJsonValue(value));
232 QJsonArray &
operator<<(QJsonArray &json,
const QDateTime &value)
234 json.append(QJsonValue(value.toString()));
238 QJsonArray &
operator<<(QJsonArray &json,
const QPixmap &value)
241 json.append(QJsonValue(pm));
245 QJsonArray &
operator<<(QJsonArray &json,
const QByteArray &value)
247 QString pm(QByteArray::fromHex(value));
248 json.append(QJsonValue(pm));
252 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const int &> &value)
254 json.insert(value.first, QJsonValue(value.second));
258 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const qint16 &> &value)
260 json.insert(value.first, QJsonValue(value.second));
264 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const qulonglong &> &value)
266 json.insert(value.first, QJsonValue(
static_cast<int>(value.second)));
270 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const qlonglong &> &value)
272 json.insert(value.first, QJsonValue(value.second));
276 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const uint &> &value)
278 json.insert(value.first, QJsonValue(
static_cast<int>(value.second)));
282 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const QString &> &value)
284 json.insert(value.first, QJsonValue(value.second));
288 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const std::string &> &value)
290 json[value.first] = QJsonValue(QString::fromStdString(value.second));
294 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const QStringList &> &value)
296 json.insert(value.first, QJsonValue(QJsonArray::fromStringList(value.second)));
300 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const double &> &value)
302 json.insert(value.first, QJsonValue(value.second));
306 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const bool &> &value)
308 json.insert(value.first, QJsonValue(value.second));
312 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const QDateTime &> &value)
314 json.insert(value.first, QJsonValue(value.second.toString()));
318 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const QPixmap &> &value)
321 json.insert(value.first, pm);
325 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<QString, const QByteArray &> &value)
327 QString pm(value.second.toHex());
328 json.insert(value.first, pm);
332 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const int &> &value)
334 json[value.first] = QJsonValue(value.second);
338 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const qint16 &> &value)
340 json[value.first] = QJsonValue(value.second);
344 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const qulonglong &> &value)
346 json[value.first] = QJsonValue(
static_cast<int>(value.second));
350 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const qlonglong &> &value)
352 json[value.first] = QJsonValue(value.second);
356 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const uint &> &value)
358 json[value.first] = QJsonValue(
static_cast<int>(value.second));
362 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const QString &> &value)
364 json[value.first] = QJsonValue(value.second);
368 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const std::string &> &value)
370 json[value.first] = QJsonValue(QString::fromStdString(value.second));
374 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const QStringList &> &value)
376 json[value.first] = QJsonValue(QJsonArray::fromStringList(value.second));
380 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const double &> &value)
382 json[value.first] = QJsonValue(value.second);
386 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const bool &> &value)
388 json[value.first] = QJsonValue(value.second);
392 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const QDateTime &> &value)
394 json[value.first] = QJsonValue(value.second.toString());
398 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const QPixmap &> &value)
401 json[value.first] = pm;
405 QJsonObject &
operator<<(QJsonObject &json,
const std::pair<CExplicitLatin1String, const QByteArray &> &value)
407 json[value.first] = QString(value.second.toHex());
411 namespace swift::misc::json
415 if (json.isEmpty()) {
return QJsonObject(); }
417 QJsonParseError error {};
418 const QJsonDocument jsonDoc(QJsonDocument::fromJson(json.toUtf8(), &error));
419 if (error.error != QJsonParseError::NoError) {
throw CJsonException(error.errorString()); }
421 return acceptCacheFormat ? json::unwrapCache(jsonDoc.object()) : jsonDoc.object();
426 const QJsonDocument doc(jsonObject);
427 const QString strJson(doc.toJson(format));
433 if (json.isEmpty()) {
return QJsonArray(); }
434 const QJsonDocument jsonDoc(QJsonDocument::fromJson(json.toUtf8()));
435 return jsonDoc.array();
440 if (toBeAppended.isEmpty())
return target;
441 const QStringList keys = toBeAppended.keys();
442 foreach (
const QString &key, keys) { target.insert(key, toBeAppended.value(key)); }
446 QJsonObject getIncrementalObject(
const QJsonObject &previousObject,
const QJsonObject ¤tObject)
448 QJsonObject incrementalObject = currentObject;
449 for (
const auto &key : previousObject.keys())
451 if (previousObject.value(key).isObject())
454 getIncrementalObject(previousObject.value(key).toObject(), currentObject.value(key).toObject());
456 incrementalObject.remove(key);
458 incrementalObject.insert(key, child);
462 if (currentObject.value(key) == previousObject.value(key)) incrementalObject.remove(key);
465 return incrementalObject;
468 QJsonObject applyIncrementalObject(
const QJsonObject &previousObject,
const QJsonObject &incrementalObject)
470 QJsonObject currentObject = previousObject;
471 for (
const auto &key : incrementalObject.keys())
474 if (!incrementalObject.value(key).isObject()) { currentObject.insert(key, incrementalObject.value(key)); }
477 auto child = applyIncrementalObject(currentObject.value(key).toObject(),
478 incrementalObject.value(key).toObject());
479 currentObject.insert(key, child);
482 return currentObject;
485 bool looksLikeJson(
const QString &json)
487 if (json.isEmpty()) {
return false; }
488 const QString t = json.trimmed();
489 return t.startsWith(
'{') && t.endsWith(
'}');
492 bool looksLikeSwiftJson(
const QString &json)
495 return looksLikeJson(json);
498 bool looksLikeSwiftDataObjectJson(
const QJsonObject &
object)
503 if (
object.size() != 1) {
return false; }
504 const QStringList keys =
object.keys();
505 if (keys.size() != 1) {
return false; }
506 const QString key = keys.front();
507 const QJsonObject cacheObject =
object.value(key).toObject();
508 return (cacheObject.contains(
"type") && cacheObject.contains(
"value"));
511 QJsonObject swiftDataObjectValue(
const QString &jsonString)
514 if (obj.isEmpty()) {
return obj; }
515 return swiftDataObjectValue(obj);
518 QJsonObject swiftDataObjectValue(
const QJsonObject &
object)
523 if (
object.size() != 1) {
return object; }
524 const QJsonObject cacheObject =
object.constBegin()->toObject();
525 if (cacheObject.contains(
"type") && cacheObject.contains(
"value"))
528 const QString key =
object.constBegin().key();
529 const QString type = cacheObject.value(
"type").toString();
533 return cacheObject.value(
"value").toObject();
538 QJsonObject unwrapCache(
const QJsonObject &
object)
540 if (
object.size() != 1) {
return object; }
541 const QJsonObject cacheObject =
object.constBegin()->toObject();
542 if (cacheObject.contains(
"type") && cacheObject.contains(
"value"))
545 const QString type = cacheObject.value(
"type").toString();
552 QJsonObject unwrapCache(
const QString &jsonString)
555 if (obj.isEmpty()) {
return obj; }
556 return unwrapCache(obj);
559 bool looksLikeSwiftContainerJson(
const QJsonObject &
object)
562 return object.contains(
"containerbase");
565 bool looksLikeSwiftTypeValuePairJson(
const QJsonObject &
object)
567 return (
object.contains(
"type") &&
object.contains(
"value"));
570 bool looksLikeSwiftDbJson(
const QJsonObject &
object) {
return (
object.contains(
"data")); }
572 QString firstJsonValueAsString(
const QString &json)
574 static const QString empty;
575 if (json.isEmpty()) {
return empty; }
577 return firstJsonValueAsString(obj);
580 QString firstJsonValueAsString(
const QJsonObject &json)
582 static const QString empty;
583 if (json.isEmpty()) {
return empty; }
584 const QStringList keys1 = json.keys();
585 if (keys1.isEmpty()) {
return empty; }
586 if (keys1.contains(
"value", Qt::CaseInsensitive)) {
return json.value(
"value").toString(); }
588 const QJsonObject jsonLevel1 = json.value(keys1.front()).toObject();
589 return jsonLevel1.value(
"value").toString();
592 QStringList firstJsonValueAsStringList(
const QString &json)
594 static const QStringList empty;
595 if (json.isEmpty()) {
return empty; }
597 return firstJsonValueAsStringList(obj);
600 int firstJsonValueAsInt(
const QString &json,
int defaultValue,
bool *ok)
602 if (ok) { *ok =
false; }
603 if (json.isEmpty()) {
return defaultValue; }
605 return firstJsonValueAsInt(obj, defaultValue, ok);
608 int firstJsonValueAsInt(
const QJsonObject &json,
int defaultValue,
bool *ok)
610 if (ok) { *ok =
false; }
611 if (json.isEmpty()) {
return defaultValue; }
612 const QStringList keys1 = json.keys();
613 if (keys1.isEmpty()) {
return defaultValue; }
614 if (keys1.contains(
"value", Qt::CaseInsensitive))
616 if (ok) { *ok =
true; }
617 return json.value(
"value").toInt(defaultValue);
620 const QJsonObject jsonLevel1 = json.value(keys1.front()).toObject();
621 if (!jsonLevel1.contains(
"value")) {
return defaultValue; }
622 if (ok) { *ok =
true; }
623 return jsonLevel1.value(
"value").toInt(defaultValue);
626 QStringList firstJsonValueAsStringList(
const QJsonObject &json)
628 static const QStringList empty;
629 if (json.isEmpty()) {
return empty; }
630 const QStringList keys1 = json.keys();
631 if (keys1.isEmpty()) {
return empty; }
632 if (keys1.contains(
"value", Qt::CaseInsensitive)) {
return arrayToQStringList(json.value(
"value").toArray()); }
634 const QJsonObject jsonLevel1 = json.value(keys1.front()).toObject();
635 return arrayToQStringList(jsonLevel1.value(
"value").toArray());
638 QStringList arrayToQStringList(
const QJsonArray &array)
641 if (array.isEmpty()) {
return sl; }
642 for (
int i = 0; i < array.size(); i++)
644 if (!array.at(i).isString()) {
continue; }
645 sl.push_back(array.at(i).toString());
651 QDataStream &
operator<<(QDataStream &s,
const std::string &v)
653 s << QString::fromStdString(v);
660 v = vs.toStdString();
Thrown when a convertFromJson method encounters an unrecoverable error in JSON data.
QString stringFromJsonObject(const QJsonObject &jsonObject, QJsonDocument::JsonFormat format)
JSON Object from string.
QJsonObject & appendJsonObject(QJsonObject &target, const QJsonObject &toBeAppended)
Append to first JSON object (concatenate)
QJsonObject jsonObjectFromString(const QString &json, bool acceptCacheFormat)
JSON Object from string.
QJsonArray jsonArrayFromString(const QString &json)
JSON Array from string.
const QJsonValue & operator>>(const QJsonValue &json, int &value)
Streaming operators for QJsonValue (to value)
Free functions in swift::misc.
SWIFT_MISC_EXPORT QString pixmapToPngHexString(const QPixmap &pixmap)
Pixmap as HEX string (for PNG image)
SWIFT_MISC_EXPORT bool pngHexStringToPixmapRef(const QString &hexString, QPixmap &pixmap)
Hex encoded pixmap string to Pixmap.
QDebug operator<<(QDebug d, const CRange< I > &range)
Streaming operators for CRange to qDebug.
SWIFT_MISC_EXPORT QDateTime fromStringUtc(const QString &dateTimeString, const QString &format)
Same as QDateTime::fromString but QDateTime will be set to UTC.