Compare commits

...

3 Commits

Author SHA1 Message Date
d479a5e242 Implemented JSON serialization
Added new iterator and const_iterator objects to UserList and also
implemented the serialization function to write to a JSON file
2025-02-07 23:06:27 +02:00
09b1e17de0 Implemented error checks for parsing the JSON file 2025-02-07 20:20:04 +02:00
a458d82577 Refactored code and possibly fixed a bug 2025-02-07 20:13:30 +02:00
6 changed files with 162 additions and 16 deletions

View File

@ -5,31 +5,57 @@
#include <QJsonArray>
#include <QJsonObject>
UserList&& loadUserList(const QString &file)
UserList loadUserList(const QString &file)
{
QFile doc{std::filesystem::path{file.toStdString()}};
doc.open(QFile::ReadOnly);
QString fileContents = doc.readAll();
QJsonDocument document = QJsonDocument::fromJson(fileContents.toUtf8());
QJsonParseError errors;
QJsonDocument document =
QJsonDocument::fromJson(fileContents.toUtf8(),
&errors);
if (document.isNull())
{
qDebug() << errors.errorString();
throw std::runtime_error{"Could not parse JSON file"};
}
QJsonArray array = document.array();
QVector<User> container;
for (auto elem: array)
for (QJsonArray::const_iterator elem = array.constBegin(); elem != array.constEnd(); ++elem)
{
auto obj = elem.toObject();
User newUser{obj["name"].toString(), QDate::fromString(obj["date_of_birth"].toString()),
QDate::fromString(obj["date_of_death"].toString()), obj["default"].toBool()};
auto obj = elem->toObject();
User newUser{obj[NAME_LABEL].toString(), QDate::fromString(obj[DATE_OF_BIRTH_LABEL].toString()),
QDate::fromString(obj[DATE_OF_DEATH_LABEL].toString()), obj[DEFAULT_LABEL].toBool()};
container.append(newUser);
}
UserList returnObj;
returnObj.setList(container);
return std::move(returnObj);
return container;
}
void saveUserList(const UserList &list)
void saveUserList(const UserList &list, const QString &file)
{
QFile doc{std::filesystem::path{file.toStdString()}};
doc.open(QFile::WriteOnly);
QJsonArray container;
for(auto &obj: list)
{
QJsonObject newObject;
newObject[NAME_LABEL] = obj.getName();
newObject[DATE_OF_BIRTH_LABEL] = obj.getDateOfBirth().toString();
newObject[DATE_OF_DEATH_LABEL] = obj.getDateOfDeath().toString();
newObject[DEFAULT_LABEL] = obj.getIsItDefault();
container.append(newObject);
}
QJsonDocument document{container};
doc.write(document.toJson());
}

View File

@ -1,9 +1,14 @@
#ifndef SERIALIZATION_H
#define SERIALIZATION_H
#define NAME_LABEL "name"
#define DATE_OF_BIRTH_LABEL "date_of_birth"
#define DATE_OF_DEATH_LABEL "date_of_death"
#define DEFAULT_LABEL "default"
#include "userlist.h"
UserList &&loadUserList(const QString &file);
void saveUserList(const UserList &list);
UserList loadUserList(const QString &file);
void saveUserList(const UserList &list, const QString &file);
#endif // SERIALIZATION_H

View File

@ -3,3 +3,43 @@
User::User(QString name, QDate dateOfBirth, QDate dateOfDeath, bool isItDefault)
: name{name}, dateOfBirth{dateOfBirth}, dateOfDeath{dateOfDeath}, isItDefault{isItDefault}
{}
QString User::getName() const
{
return name;
}
void User::setName(const QString &newName)
{
name = newName;
}
QDate User::getDateOfBirth() const
{
return dateOfBirth;
}
void User::setDateOfBirth(const QDate &newDateOfBirth)
{
dateOfBirth = newDateOfBirth;
}
QDate User::getDateOfDeath() const
{
return dateOfDeath;
}
void User::setDateOfDeath(const QDate &newDateOfDeath)
{
dateOfDeath = newDateOfDeath;
}
bool User::getIsItDefault() const
{
return isItDefault;
}
void User::setIsItDefault(bool newIsItDefault)
{
isItDefault = newIsItDefault;
}

View File

@ -7,6 +7,18 @@ class User
public:
User(QString name, QDate dateOfBirth, QDate dateOfDeath, bool isItDefault = false);
QString getName() const;
void setName(const QString &newName);
QDate getDateOfBirth() const;
void setDateOfBirth(const QDate &newDateOfBirth);
QDate getDateOfDeath() const;
void setDateOfDeath(const QDate &newDateOfDeath);
bool getIsItDefault() const;
void setIsItDefault(bool newIsItDefault);
private:
QString name;
QDate dateOfBirth;

View File

@ -1,6 +1,8 @@
#include "userlist.h"
UserList::UserList() {}
UserList::UserList(const QVector<User> &list):
list{list}
{}
QVector<User> UserList::getList() const
{

View File

@ -5,15 +5,76 @@
#include <QObject>
class UserList: public QObject
class UserList : public QObject
{
Q_OBJECT
public:
UserList();
UserList(const QVector<User> &list);
QVector<User> getList() const;
void setList(const QVector<User> &newList);
struct iteratable
{
using iterator_category = std::forward_iterator_tag;
using difference_type = std::ptrdiff_t;
using value_type = User;
using pointer = User *; // or also value_type*
using reference = User&; // or also value_type&
iteratable(User *begin)
: ptr{begin}
{}
reference operator*() const { return *ptr; }
pointer operator->() { return ptr; }
// Prefix increment
iteratable& operator++() { ptr++; return *this; }
// Postfix increment
iteratable operator++(int) { iteratable tmp = *this; ++(*this); return tmp; }
friend bool operator== (const iteratable& a, const iteratable& b) { return a.ptr == b.ptr; };
friend bool operator!= (const iteratable& a, const iteratable& b) { return a.ptr != b.ptr; };
private:
User* ptr;
};
struct const_interatable
{
using iterator_category = std::forward_iterator_tag;
using difference_type = std::ptrdiff_t;
using value_type = const User;
using pointer = const User *; // or also value_type*
using reference = const User&; // or also value_type&
const_interatable(const User *begin)
: ptr{begin}
{}
reference operator*() const { return *ptr; }
pointer operator->() { return ptr; }
// Prefix increment
const_interatable& operator++() { ptr++; return *this; }
// Postfix increment
const_interatable operator++(int) { const_interatable tmp = *this; ++(*this); return tmp; }
friend bool operator== (const const_interatable& a, const const_interatable& b) { return a.ptr == b.ptr; };
friend bool operator!= (const const_interatable& a, const const_interatable& b) { return a.ptr != b.ptr; };
private:
const User* ptr;
};
iteratable begin() { return &*list.begin(); }
iteratable end() { return &*list.end(); }
const_interatable begin() const { return &*list.begin(); }
const_interatable end() const { return &*list.end(); }
private:
QVector<User> list;
};