Russian Qt Forum
Май 03, 2024, 17:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: JSON сериализация-десериализация  (Прочитано 23744 раз)
GPPsoft
Гость
« : Декабрь 03, 2013, 05:37 »

Здравствуйте. Переписываю один проект с java. В java я использую библиотеку gson для сериализации-десериализации. Как с этим в QT? По хорошему, хотелось бы чтобы это выглядело аналогично этому:
Псевдокод:
Код:
String<-toJson(myObj);
myObj<-fromJson(jsonString,Type);


Заранее огромное спасибо!

P.S: QT5
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #1 : Декабрь 03, 2013, 09:02 »

Собственно JSON парсер есть в Qt 5 "из коробки". Сериализацию/десериализацию объектов нужно будет допиливать самостоятельно.
Записан
GPPsoft
Гость
« Ответ #2 : Декабрь 03, 2013, 09:07 »

Собственно JSON парсер есть в Qt 5 "из коробки". Сериализацию/десериализацию объектов нужно будет допиливать самостоятельно.
Как это сделать? У QJsonDocument есть метод fromVariant... Могу ли я объект своего класса привести к QVariant?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #3 : Декабрь 03, 2013, 09:12 »

Как это сделать? У QJsonDocument есть метод fromVariant... Могу ли я объект своего класса привести к QVariant?
Вначале нужно научить объекты своего класса (де)серилизоваться в QDataStream.
Записан
GPPsoft
Гость
« Ответ #4 : Декабрь 03, 2013, 09:17 »

Как это сделать? У QJsonDocument есть метод fromVariant... Могу ли я объект своего класса привести к QVariant?
Вначале нужно научить объекты своего класса (де)серилизоваться в QDataStream.
Как это сделать? Можно ссылку на туториал. Спасибо.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Декабрь 03, 2013, 09:36 »

Как это сделать? Можно ссылку на туториал. Спасибо.
http://stackoverflow.com/questions/13835197/serializing-my-custom-class-in-qt
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #6 : Декабрь 03, 2013, 09:47 »

В этом блоге есть несколько статей по сериализации.
http://www.mimec.org/taxonomy/term/51
Записан
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
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #8 : Декабрь 03, 2013, 10:43 »

http://qt-project.org/doc/qt-4.8/qvariant.html
читаем раздел: Detailed Description
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #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
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #11 : Декабрь 03, 2013, 11:28 »

Спасибо. Но слишком много классов(около 30) у меня которые нужно портировать из Java. Не вариант. Если бы как-нибудь автоматизировать этот процесс. подхватывать открытые поля к примеру. Печально все короче...
Так сделайте методы в базовом классе, которые будут сохранять/загружать все свойства, только не в QDataStream, а в QJsonObject.
Посмотрите на пример, который вы сами привели чуть выше. Улыбающийся
Все можно решить двумя методами. Подмигивающий
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #12 : Декабрь 03, 2013, 11:31 »

QJsonValue QJsonValue::fromVariant(const QVariant & variant) [static]

не может помочь?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #13 : Декабрь 03, 2013, 11:56 »

не может помочь?
Он поможет при сохранении полей пользовательского класса в QJsonObject.
Записан
GPPsoft
Гость
« Ответ #14 : Декабрь 03, 2013, 12:01 »

не может помочь?
Он поможет при сохранении полей пользовательского класса в QJsonObject.
Вообщем сейчас попробую через свойства и потом в цикле заполнять QVariantMap значениями. Вот бы еще десереализацию как-нибудь придумать...
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.091 секунд. Запросов: 23.