Сериализация QList‹MyObject› в JSON

У меня проблема, я пытался искать в Интернете, например, конвертировать QList в JSON и отправлять его по URL-адресу, но во-первых, я ничего не нашел о сериализации QList<Myobject> в json с Qt и C++.

Мой не пустой QList:

QList<User> lista;

моя цель - список в JSON.

Как его сериализовать? Я видел в Интернете, что QJson существует, но является внешним компонентом... в Qt 5.9 есть внутренний компонент?


person Mr. Developer    schedule 15.06.2017    source источник
comment
Вы исследовали это?   -  person NathanOliver    schedule 15.06.2017
comment
Да, может быть, не существует одного прямого решения из QList в Json, может быть, я делаю преобразование Qlist в QJsonDocument... верю   -  person Mr. Developer    schedule 15.06.2017


Ответы (2)


внешний компонент

Qt имеет внутреннюю поддержку JSON.

Сначала вам нужно предоставить представление QJsonValue для самого объекта, а затем перебрать список и преобразовать его, например, в массив. Используйте QJsonDocument, чтобы преобразовать его в текст:

// https://github.com/KubaO/stackoverflown/tree/master/questions/json-serialize-44567345
#include <QtCore>
#include <cstdio>

struct User {
   QString name;
   int age;
   QJsonObject toJson() const {
      return {{"name", name}, {"age", age}};
   }
};

QJsonArray toJson(const QList<User> & list) {
   QJsonArray array;
   for (auto & user : list)
      array.append(user.toJson());
   return array;
}

int main() {
   QList<User> users{{"John Doe", 43}, {"Mary Doe", 44}};
   auto doc = QJsonDocument(toJson(users));
   std::printf("%s", doc.toJson().constData());
}

Выход:

[
    {
        "age": 43,
        "name": "John Doe"
    },
    {
        "age": 44,
        "name": "Mary Doe"
    }
]
person Kuba hasn't forgotten Monica    schedule 15.06.2017

Я думаю, что простым решением было бы создать объект JSON как QString. Для этого вы можете реализовать QString User::toJson(), который дает вам допустимую строку JSON. Затем вы можете перебирать свой QList с помощью foreach :

QString finalString ="";

foreach(User user, lista) {
   finalString += user.toJson();
   // Something like that...
}

return finalString;
person Xatyrian    schedule 15.06.2017