GPPsoft
Гость
|
|
« : Декабрь 03, 2013, 05:37 » |
|
Здравствуйте. Переписываю один проект с java. В java я использую библиотеку gson для сериализации-десериализации. Как с этим в QT? По хорошему, хотелось бы чтобы это выглядело аналогично этому: Псевдокод:String<-toJson(myObj); myObj<-fromJson(jsonString,Type);
Заранее огромное спасибо! P.S: QT5
|
|
|
Записан
|
|
|
|
xokc
|
|
« Ответ #1 : Декабрь 03, 2013, 09:02 » |
|
Собственно JSON парсер есть в Qt 5 "из коробки". Сериализацию/десериализацию объектов нужно будет допиливать самостоятельно.
|
|
|
Записан
|
|
|
|
GPPsoft
Гость
|
|
« Ответ #2 : Декабрь 03, 2013, 09:07 » |
|
Собственно JSON парсер есть в Qt 5 "из коробки". Сериализацию/десериализацию объектов нужно будет допиливать самостоятельно.
Как это сделать? У QJsonDocument есть метод fromVariant... Могу ли я объект своего класса привести к QVariant?
|
|
|
Записан
|
|
|
|
Old
|
|
« Ответ #3 : Декабрь 03, 2013, 09:12 » |
|
Как это сделать? У QJsonDocument есть метод fromVariant... Могу ли я объект своего класса привести к QVariant?
Вначале нужно научить объекты своего класса (де)серилизоваться в QDataStream.
|
|
|
Записан
|
|
|
|
GPPsoft
Гость
|
|
« Ответ #4 : Декабрь 03, 2013, 09:17 » |
|
Как это сделать? У QJsonDocument есть метод fromVariant... Могу ли я объект своего класса привести к QVariant?
Вначале нужно научить объекты своего класса (де)серилизоваться в QDataStream. Как это сделать? Можно ссылку на туториал. Спасибо.
|
|
|
Записан
|
|
|
|
Old
|
|
« Ответ #5 : Декабрь 03, 2013, 09:36 » |
|
|
|
|
Записан
|
|
|
|
|
GPPsoft
Гость
|
|
« Ответ #7 : Декабрь 03, 2013, 10:24 » |
|
Ок. Написал класс из примера: #ifndef PEOPLE_H #define PEOPLE_H
#include <QObject> #include <QDataStream> #include <QMetaProperty>
class People : public QObject { Q_OBJECT Q_PROPERTY(int id READ getId WRITE setId) Q_PROPERTY(QString Name READ getName WRITE setName)
public: explicit People(QObject *parent = 0); int getId() const { return id; } void setId(int newId) { id = newId; } QString getName() const { return Name; } void setName(const QString &newName) { Name = newName; }
private: int id; QString Name;
signals:
public slots:
};
QDataStream &operator<<(QDataStream &ds, const People &obj); QDataStream &operator>>(QDataStream &ds, People &obj) ; #endif // PEOPLE_H
#include "people.h"
People::People(QObject *parent) : QObject(parent) { }
QDataStream &operator<<(QDataStream &ds, const People &obj) { for(int i=0; i<obj.metaObject()->propertyCount(); ++i) { if(obj.metaObject()->property(i).isStored(&obj)) { ds << obj.metaObject()->property(i).read(&obj);
} } return ds; } QDataStream &operator>>(QDataStream &ds, People &obj) { QVariant var; for(int i=0; i<obj.metaObject()->propertyCount(); ++i) { if(obj.metaObject()->property(i).isStored(&obj)) { ds >> var; obj.metaObject()->property(i).write(&obj, var); } } return ds; }
Как теперь привести его к QVariant?
|
|
|
Записан
|
|
|
|
Johnik
|
|
« Ответ #8 : Декабрь 03, 2013, 10:43 » |
|
|
|
|
Записан
|
|
|
|
Old
|
|
« Ответ #9 : Декабрь 03, 2013, 10:54 » |
|
Как теперь привести его к QVariant?
Посмотрел доку на QJsonDocument. fromVariant создает объект JsonDocument из QVariantList/QVariantMap, который и должен лежать в указаном variant. Из пользовательского объекта json документ получить не получится. Нужно будет сделать например функцию: C++ (Qt) QJsonObject toJson( const MyClass &obj ) { QJsonObject res; // Сохраняем поля объекта в объекте JsonObject return res; }
|
|
|
Записан
|
|
|
|
GPPsoft
Гость
|
|
« Ответ #10 : Декабрь 03, 2013, 11:21 » |
|
Как теперь привести его к QVariant?
Посмотрел доку на QJsonDocument. fromVariant создает объект JsonDocument из QVariantList/QVariantMap, который и должен лежать в указаном variant. Из пользовательского объекта json документ получить не получится. Нужно будет сделать например функцию: C++ (Qt) QJsonObject toJson( const MyClass &obj ) { QJsonObject res; // Сохраняем поля объекта в объекте JsonObject return res; }
Спасибо. Но слишком много классов(около 30) у меня которые нужно портировать из Java. Не вариант. Если бы как-нибудь автоматизировать этот процесс. подхватывать открытые поля к примеру. Печально все короче...
|
|
|
Записан
|
|
|
|
Old
|
|
« Ответ #11 : Декабрь 03, 2013, 11:28 » |
|
Спасибо. Но слишком много классов(около 30) у меня которые нужно портировать из Java. Не вариант. Если бы как-нибудь автоматизировать этот процесс. подхватывать открытые поля к примеру. Печально все короче...
Так сделайте методы в базовом классе, которые будут сохранять/загружать все свойства, только не в QDataStream, а в QJsonObject. Посмотрите на пример, который вы сами привели чуть выше. Все можно решить двумя методами.
|
|
|
Записан
|
|
|
|
Johnik
|
|
« Ответ #12 : Декабрь 03, 2013, 11:31 » |
|
QJsonValue QJsonValue::fromVariant(const QVariant & variant) [static]
не может помочь?
|
|
|
Записан
|
|
|
|
Old
|
|
« Ответ #13 : Декабрь 03, 2013, 11:56 » |
|
не может помочь?
Он поможет при сохранении полей пользовательского класса в QJsonObject.
|
|
|
Записан
|
|
|
|
GPPsoft
Гость
|
|
« Ответ #14 : Декабрь 03, 2013, 12:01 » |
|
не может помочь?
Он поможет при сохранении полей пользовательского класса в QJsonObject. Вообщем сейчас попробую через свойства и потом в цикле заполнять QVariantMap значениями. Вот бы еще десереализацию как-нибудь придумать...
|
|
|
Записан
|
|
|
|
|