Files
GenericQtClientCore/formats/jsonparser.cpp

66 lines
2.0 KiB
C++

#include "jsonparser.h"
#include <QJsonArray>
#include <QJsonObject>
#include "../model/metadata.h"
QList<QHash<int, QVariant>> JsonParser::toItemValuesList(const QByteArray& jsonData,
const QString& objectName) {
QList<QHash<int, QVariant>> result;
if (jsonData.isEmpty()) {
return result;
}
QJsonArray itemArray = extractItemArray(jsonData, objectName);
foreach (QJsonValue value, itemArray) {
QJsonObject itemJsonObject = value.toObject();
QHash<int, QVariant> values = jsonObjectToItemValues(itemJsonObject);
result.append(values);
}
return result;
}
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;
}
QHash<int, QVariant> JsonParser::jsonObjectToItemValues(const QJsonObject& itemJsonObject) {
QHash<int, QVariant> values;
for (auto iter = ROLE_NAMES.cbegin(), end = ROLE_NAMES.cend(); iter != end; ++iter) {
std::pair<int, QVariant> keyValuePair = getKeyValuePair(itemJsonObject, iter.key());
values.insert(keyValuePair.first, keyValuePair.second);
}
return values;
}
pair<int, QVariant> 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<int, QVariant>(role, result.toString());
}