diff --git a/src/blackmisc/containerbase.h b/src/blackmisc/containerbase.h index cb42fe0e4..504de032c 100644 --- a/src/blackmisc/containerbase.h +++ b/src/blackmisc/containerbase.h @@ -147,7 +147,7 @@ namespace BlackMisc //! Assign from JSON object string void convertFromJson(const QString &jsonString) { - this->convertFromJson(BlackMisc::Json::jsonObjectFromString(jsonString)); + this->convertFromJson(Json::jsonObjectFromString(jsonString)); } //! Call convertFromJson, catch any CJsonException that is thrown and return it as CStatusMessage. diff --git a/src/blackmisc/db/datastoreobjectlist.cpp b/src/blackmisc/db/datastoreobjectlist.cpp index 89551dddb..f965c9c85 100644 --- a/src/blackmisc/db/datastoreobjectlist.cpp +++ b/src/blackmisc/db/datastoreobjectlist.cpp @@ -195,6 +195,42 @@ namespace BlackMisc return count; } + template + CONTAINER IDatastoreObjectList::fromMultipleJsonFormats(const QJsonObject &jsonObject) + { + // also accept cache format + if (jsonObject.isEmpty()) + { + const CONTAINER c; + return c; + } + + if (Json::looksLikeSwiftDataObject(jsonObject)) + { + const QJsonObject cacheObj = Json::swiftDataObjectValue(jsonObject); + // swift own format + CONTAINER container; + container.convertFromJson(cacheObj); + return container; + } + + if (Json::looksLikeSwiftContainerJson(jsonObject)) + { + CONTAINER container; + container.convertFromJson(jsonObject); + return container; + } + + if (jsonObject.contains("data")) + { + // DB format + return IDatastoreObjectList::fromDatabaseJson(jsonObject.value("data").toArray()); + } + + // no idea what this is + throw CJsonException("Unsupported JSON format"); + } + template QDateTime IDatastoreObjectList::latestDbTimestamp() const { diff --git a/src/blackmisc/db/datastoreobjectlist.h b/src/blackmisc/db/datastoreobjectlist.h index 19a1d7c64..59356837e 100644 --- a/src/blackmisc/db/datastoreobjectlist.h +++ b/src/blackmisc/db/datastoreobjectlist.h @@ -13,6 +13,7 @@ #define BLACKMISC_DB_DATABASEOBJECTLIST_H #include "blackmisc/timestampobjectlist.h" +#include "blackmisc/jsonexception.h" #include #include #include @@ -65,6 +66,10 @@ namespace BlackMisc //! Number of entries with valid DB key int countWithValidDbKey() const; + //! From multiple JSON formats + //! \remark supports native swift C++ format, DB format, and cache format + static CONTAINER fromMultipleJsonFormats(const QJsonObject &jsonObject); + //! From DB JSON with default prefixes //! \remark Specialized classes might have their own fromDatabaseJson implementation static CONTAINER fromDatabaseJson(const QJsonArray &array); diff --git a/src/blackmisc/json.cpp b/src/blackmisc/json.cpp index cae69b5a3..aa462ac07 100644 --- a/src/blackmisc/json.cpp +++ b/src/blackmisc/json.cpp @@ -473,7 +473,7 @@ namespace BlackMisc QJsonObject swiftDataObjectValue(const QJsonObject &object) { - if (object.size() != 1) { return object; } + if (object.size() != 1) { return object; } // no cache format const QString key = object.keys().front(); const QJsonObject cacheObject = object.value(key).toObject(); if (cacheObject.contains("type") && cacheObject.contains("value")) @@ -489,5 +489,11 @@ namespace BlackMisc if (obj.isEmpty()) { return obj; } return swiftDataObjectValue(obj); } + + bool looksLikeSwiftContainerJson(const QJsonObject &object) + { + // CContainerbase::convertFromJson + return object.contains("containerbase"); + } } // ns } // ns diff --git a/src/blackmisc/json.h b/src/blackmisc/json.h index 723b3e4d0..0a12b1f11 100644 --- a/src/blackmisc/json.h +++ b/src/blackmisc/json.h @@ -257,6 +257,9 @@ namespace BlackMisc //! \remark Quick check if the string could be a valid swift JSON string BLACKMISC_EXPORT bool looksLikeSwiftJson(const QString &json); + //! Looks like a valid swift container JSON object + BLACKMISC_EXPORT bool looksLikeSwiftContainerJson(const QJsonObject &object); + //! Looks like a cache/setting object BLACKMISC_EXPORT bool looksLikeSwiftDataObject(const QJsonObject &object); diff --git a/src/blackmisc/network/entityflags.h b/src/blackmisc/network/entityflags.h index 878ab6769..1a4336855 100644 --- a/src/blackmisc/network/entityflags.h +++ b/src/blackmisc/network/entityflags.h @@ -71,16 +71,16 @@ namespace BlackMisc static QString flagToString(EntityFlag flag); //! Convert to string - static QString flagToString(BlackMisc::Network::CEntityFlags::Entity flag); + static QString flagToString(CEntityFlags::Entity flag); //! Representing single entity? - static bool isSingleEntity(BlackMisc::Network::CEntityFlags::Entity flag); + static bool isSingleEntity(CEntityFlags::Entity flag); //! Any finished state static bool isFinishedReadState(ReadState state); //! Represented number of entities - static int numberOfEntities(BlackMisc::Network::CEntityFlags::Entity flag); + static int numberOfEntities(CEntityFlags::Entity flag); //! Convert to string static QString flagToString(ReadState flag);