From fa09a6e53be75629da3b401532dd07ca58e08431 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 3 Jul 2018 19:35:01 +0200 Subject: [PATCH] Ref T286, JSON utility functions --- src/blackmisc/json.cpp | 84 ++++++++++++++++++++++++++++++++++++++++++ src/blackmisc/json.h | 23 +++++++++++- 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/src/blackmisc/json.cpp b/src/blackmisc/json.cpp index 236139e87..d414653bb 100644 --- a/src/blackmisc/json.cpp +++ b/src/blackmisc/json.cpp @@ -548,5 +548,89 @@ namespace BlackMisc { return (object.contains("data")); } + + QString firstJsonValueAsString(const QString &json) + { + static const QString empty; + if (json.isEmpty()) { return empty; } + const QJsonObject obj = jsonObjectFromString(json); + return firstJsonValueAsString(obj); + } + + QString firstJsonValueAsString(const QJsonObject &json) + { + static const QString empty; + if (json.isEmpty()) { return empty; } + const QStringList keys1 = json.keys(); + if (keys1.isEmpty()) { return empty; } + if (keys1.contains("value", Qt::CaseInsensitive)) + { + return json.value("value").toString(); + } + + const QJsonObject jsonLevel1 = json.value(keys1.front()).toObject(); + return jsonLevel1.value("value").toString(); + } + + QStringList firstJsonValueAsStringList(const QString &json) + { + static const QStringList empty; + if (json.isEmpty()) { return empty; } + const QJsonObject obj = jsonObjectFromString(json); + return firstJsonValueAsStringList(obj); + } + + int firstJsonValueAsInt(const QString &json, int defaultValue, bool *ok) + { + if (ok) { *ok = false; } + if (json.isEmpty()) { return defaultValue; } + const QJsonObject obj = jsonObjectFromString(json); + return firstJsonValueAsInt(obj, defaultValue, ok); + } + + int firstJsonValueAsInt(const QJsonObject &json, int defaultValue, bool *ok) + { + if (ok) { *ok = false; } + if (json.isEmpty()) { return defaultValue; } + const QStringList keys1 = json.keys(); + if (keys1.isEmpty()) { return defaultValue; } + if (keys1.contains("value", Qt::CaseInsensitive)) + { + if (ok) { *ok = true; } + return json.value("value").toInt(defaultValue); + } + + const QJsonObject jsonLevel1 = json.value(keys1.front()).toObject(); + if (!jsonLevel1.contains("value")) { return defaultValue; } + if (ok) { *ok = true; } + return jsonLevel1.value("value").toInt(defaultValue); + } + + QStringList firstJsonValueAsStringList(const QJsonObject &json) + { + static const QStringList empty; + if (json.isEmpty()) { return empty; } + const QStringList keys1 = json.keys(); + if (keys1.isEmpty()) { return empty; } + if (keys1.contains("value", Qt::CaseInsensitive)) + { + return arrayToQStringList(json.value("value").toArray()); + } + + const QJsonObject jsonLevel1 = json.value(keys1.front()).toObject(); + return arrayToQStringList(jsonLevel1.value("value").toArray()); + } + + QStringList arrayToQStringList(const QJsonArray &array) + { + QStringList sl; + if (array.isEmpty()) { return sl; } + for (int i = 0; i < array.size(); i++) + { + if (!array.at(i).isString()) { continue; } + sl.push_back(array.at(i).toString()); + } + return sl; + } } // ns } // ns diff --git a/src/blackmisc/json.h b/src/blackmisc/json.h index 7dda8f859..d5c76dd94 100644 --- a/src/blackmisc/json.h +++ b/src/blackmisc/json.h @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include #include @@ -247,6 +247,27 @@ namespace BlackMisc //! \ingroup JSON BLACKMISC_EXPORT QJsonArray jsonArrayFromString(const QString &json); + //! First JSON string object marked as "value" + BLACKMISC_EXPORT QString firstJsonValueAsString(const QString &json); + + //! First JSON string object marked as "value" + BLACKMISC_EXPORT QString firstJsonValueAsString(const QJsonObject &json); + + //! First JSON string object marked as "value" + BLACKMISC_EXPORT int firstJsonValueAsInt(const QString &json, int defaultValue = -1, bool *ok = nullptr); + + //! First JSON string object marked as "value" + BLACKMISC_EXPORT int firstJsonValueAsInt(const QJsonObject &json, int defaultValue = -1, bool *ok = nullptr); + + //! First JSON string list object marked as "value" + BLACKMISC_EXPORT QStringList firstJsonValueAsStringList(const QString &json); + + //! First JSON string list object marked as "value" + BLACKMISC_EXPORT QStringList firstJsonValueAsStringList(const QJsonObject &json); + + //! JSON array to QStringList + BLACKMISC_EXPORT QStringList arrayToQStringList(const QJsonArray &array); + //! Creates an incremental json object from two existing objects BLACKMISC_EXPORT QJsonObject getIncrementalObject(const QJsonObject &previousObject, const QJsonObject ¤tObject);