#include "jsonparser.h" #include #include #include "../model/metadata.h" QList JsonParser::toItemValuesList(const QByteArray& jsonData, const QString& objectName) { QList result; if (jsonData.isEmpty()) { return result; } QJsonArray itemArray = extractItemArray(jsonData, objectName); foreach (QJsonValue value, itemArray) { QJsonObject itemJsonObject = value.toObject(); ModelItemValues values = jsonObjectToItemValues(itemJsonObject); result.append(values); } return result; } QByteArray JsonParser::itemValuesListToJson(const QList& itemValuesList, const QString& objectName) { QJsonDocument jsonDoc; QJsonObject rootObject; QJsonArray itemArray; for (const QHash& itemValues : itemValuesList) { QJsonObject itemObject; QListIterator i(USER_FACING_ROLES); while (i.hasNext()) { const UserRoles role = i.next(); const QString roleName = ROLE_NAMES.value(role); const QVariant value = itemValues.value(role); if (STRING_ROLES.contains(role)) { itemObject.insert(roleName, value.toString()); } else if (INT_ROLES.contains(role)) { itemObject.insert(roleName, value.toInt()); } else if (DOUBLE_ROLES.contains(role)) { itemObject.insert(roleName, value.toDouble()); } else { qCritical() << QString("Can't find data type for role %1!!!").arg(role); } } itemArray.append(itemObject); } rootObject.insert(objectName, itemArray); jsonDoc.setObject(rootObject); return jsonDoc.toJson(QJsonDocument::Compact); } JsonParser::JsonParser() {} QJsonArray JsonParser::extractItemArray(const QByteArray& jsonData, const QString& objectName) { QJsonDocument doc = QJsonDocument::fromJson(jsonData); QJsonArray itemArray; if (objectName.isEmpty()) { itemArray = doc.array(); } else { QJsonObject rootObject = doc.object(); itemArray = rootObject.value(objectName).toArray(); } return itemArray; } ModelItemValues JsonParser::jsonObjectToItemValues(const QJsonObject& itemJsonObject) { ModelItemValues values; QListIterator i(USER_FACING_ROLES); while (i.hasNext()) { const UserRoles role = i.next(); std::pair keyValuePair = getKeyValuePair(itemJsonObject, role); values.insert(keyValuePair.first, keyValuePair.second); } return values; } pair JsonParser::getKeyValuePair(const QJsonObject& itemJsonObject, const int role) { QVariant result; const QJsonValue jsonValue = itemJsonObject[ROLE_NAMES.value(role)]; if (STRING_ROLES.contains(role)) { result = jsonValue.toString(); } else if (INT_ROLES.contains(role)) { result = jsonValue.toInt(); } else if (DOUBLE_ROLES.contains(role)) { result = jsonValue.toDouble(); } else { qCritical() << QString("Cant find data type of role %1!!!").arg(role); } return pair(role, result); }