#include "jsonparser.h" #include #include #include "../model/metadata.h" #include "../structs.h" QList JsonParser::toItemValuesList(const QByteArray& jsonData, const QString& rootValueName) { QList result; if (jsonData.isEmpty()) { return result; } // TODO tidy up the following code and encapsulate into functions; QJsonDocument doc = QJsonDocument::fromJson(jsonData); /// case one: json value name in plural -> should contain an array of items if (rootValueName == ITEMS_KEY_STRING) { QJsonArray itemArray = extractItemArray(doc, rootValueName); foreach (QJsonValue value, itemArray) { QJsonObject itemJsonObject = value.toObject(); ModelItemValues values = jsonObjectToItemValues(itemJsonObject); result.append(values); } } /// case two: json value name in singular -> should contain an object of one item if (rootValueName == ITEM_KEY_STRING) { QJsonObject rootObject = doc.object(); QJsonObject itemJsonObject = rootObject.value(rootValueName).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 ModelItemValues& 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); } QByteArray JsonParser::ToJsonObject(const QHash& values, const QString& objectName) { QJsonDocument jsonDoc; QJsonObject rootObject; QJsonObject itemObject; QHashIterator i(values); while (i.hasNext()) { i.next(); const QString key = i.key(); const QVariant value = i.value(); itemObject.insert(key, value.toString()); } rootObject.insert(objectName, itemObject); jsonDoc.setObject(rootObject); return jsonDoc.toJson(QJsonDocument::Compact); } ModelItemValues JsonParser::serverUserCredentialsToItemValues(const QJsonDocument& jsonDoc) { ModelItemValues values; const QJsonObject rootObject = jsonDoc["data"].toObject(); const QString emailAddress = rootObject["email"].toString(); const QString uuid = rootObject["id"].toString(); const QString token = rootObject["token"].toString(); values.insert(MailRole, emailAddress); values.insert(OnlineIdRole, uuid); values.insert(AccessCodeRole, token); return values; } QList JsonParser::extractBiddings(const QJsonDocument& jsonDoc) { QList result; if (jsonDoc.isEmpty()) { return result; } QJsonArray itemArray = JsonParser::extractItemArray(jsonDoc, "data"); foreach (QJsonValue value, itemArray) { // REFACTOR implement & use "JsonParser::parseServerResponse(const QJsonObject& object, // QHash entries)" QJsonObject itemJsonObject = value.toObject(); bidding values{.userId = itemJsonObject.value("user_id").toString(), .biddingRound = itemJsonObject.value("bidding_round").toInt(), .amount = itemJsonObject.value("amount").toInt(), .depotWishOne = itemJsonObject.value("depot_wish_one").toString(), .depotWishTwo = itemJsonObject.value("depot_wish_two").toString()}; result.append(values); } return result; } QJsonArray JsonParser::extractItemArray(const QJsonDocument& doc, const QString& objectName) { 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; } JsonParser::JsonParser() {} 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); }