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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: JSON сериализация-десериализация  (Прочитано 25751 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Вот бы еще десереализацию как-нибудь придумать...
Все это есть в примере выше, только вместо чтения из QDataStream, значение нужно будет брать из QVariantMap.
Записан
Johnik
Крякер
****
Online Online

Сообщений: 339


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

Вот бы еще десереализацию как-нибудь придумать...

обратно сериализации...

например:
1. QVariant QJsonValue::toVariant() const
2. QVariant::toMap()
3. пробежаться по полям и заполнять setProperty() объекта
« Последнее редактирование: Декабрь 03, 2013, 12:25 от Johnik » Записан
GPPsoft
Гость
« Ответ #17 : Декабрь 03, 2013, 13:05 »

Вот бы еще десереализацию как-нибудь придумать...
Все это есть в примере выше, только вместо чтения из QDataStream, значение нужно будет брать из QVariantMap.
А как получить имя поля которое я должен поместить в QVariantMap?

Код:
QVariantMap MainWindow::toMap(QObject obj)
{
    QVariantMap map;
   
   for(int i=0; i<obj.metaObject()->propertyCount(); ++i) {
        if(obj.metaObject()->property(i).isStored(&obj)) {
          QVariant var = obj.metaObject()->property(i).read(&obj);---Тут QVariant
          map.insert(???,var);
        }
    }

    return map;
}

Код:
#ifndef GPPPACKET_H
#define GPPPACKET_H

#include <QObject>

class GPPPacket : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString head READ getHead WRITE setHead)

private:
    QString head;

public:
    explicit GPPPacket(QObject *parent = 0);
    void setHead(QString head){this->head=head;}
    QString getHead(){return head;}
signals:

public slots:

};

#endif // GPPPACKET_H
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

А как получить имя поля которое я должен поместить в QVariantMap?
obj.metaObject()->property(i).name()
Записан
GPPsoft
Гость
« Ответ #19 : Декабрь 03, 2013, 13:18 »

А как получить имя поля которое я должен поместить в QVariantMap?
obj.metaObject()->property(i).name()
Ок. Нашел obj.metaObject()->property(i).name(). И как я сразу его не заметил.  Но теперь другая проблема откуда-то берется поле с названием objectName. Можно ли как то его опустить? Или придется 0 элемент просто игнорировать?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Ок. Нашел obj.metaObject()->property(i).name(). И как я сразу его не заметил.  Но теперь другая проблема откуда-то берется поле с названием objectName. Можно ли как то его опустить? Или придется 0 элемент просто игнорировать?
Проще проверять имя свойства и пропускать его, т.е. не записывать его в QVariantMap.
Записан
GPPsoft
Гость
« Ответ #21 : Декабрь 03, 2013, 13:30 »

Почему-то не подхватываются свойства потомков

Код:
#ifndef SCREENPREVIEW_H
#define SCREENPREVIEW_H

#include<gpppacket.h>

class ScreenPreview: public GPPPacket
{
    Q_PROPERTY(QString data READ getData)
    Q_PROPERTY(int index READ getIndex)

private:
    QString data;
    int index=-1;
public:
    ScreenPreview(int index,QString data);
    QString getData(){return data;}
    int getIndex(){return index;}
};

#endif // SCREENPREVIEW_H
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Почему-то не подхватываются свойства потомков
Покажите, что в GPPPacket, как происходит сериализация.
Записан
GPPsoft
Гость
« Ответ #23 : Декабрь 03, 2013, 13:47 »

Почему-то не подхватываются свойства потомков
Покажите, что в GPPPacket, как происходит сериализация.

GPPPacket смотрите выше.
Сериализация:
Код:
QVariantMap MainWindow::toMap(QObject &obj)
{
    QVariantMap map;

    for(int i=0; i<obj.metaObject()->propertyCount(); ++i) {
        if(obj.metaObject()->property(i).isStored(&obj)) {
          map.insert(obj.metaObject()->property(i).name(),obj.metaObject()->property(i).read(&obj));
        }
    }

    return map;
}

имен свойств data и index нет.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Добавляйте к вашим свойствам [... STORED true]
Записан
GPPsoft
Гость
« Ответ #25 : Декабрь 03, 2013, 13:54 »

Добавляйте к вашим свойствам [... STORED true]

Код:
Q_PROPERTY(QString data READ getData STORED true)
Q_PROPERTY(int index READ getIndex STORED true)

Без толку.
Записан
GPPsoft
Гость
« Ответ #26 : Декабрь 03, 2013, 13:58 »

Подхватывается только head из GPPPacket, ну и objectName
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Без толку.
Покажите как используете, а лучше выложите архив с компилябельным примером.
Записан
GPPsoft
Гость
« Ответ #28 : Декабрь 03, 2013, 14:09 »

Без толку.
Покажите как используете, а лучше выложите архив с компилябельным примером.

Класс GPPPacket:
Цитировать
#ifndef GPPPACKET_H
#define GPPPACKET_H

#include <QObject>

class GPPPacket : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString head READ getHead WRITE setHead)

private:
    QString head;

public:
    explicit GPPPacket(QObject *parent = 0);
    void setHead(QString head){this->head=head;}
    QString getHead(){return head;}
signals:

public slots:

};

#endif // GPPPACKET_H

Класс потомок от GPPPacket:
Код:
#ifndef SCREENPREVIEW_H
#define SCREENPREVIEW_H

#include<gpppacket.h>

class ScreenPreview: public GPPPacket
{
    Q_PROPERTY(QString data READ getData)
    Q_PROPERTY(int index READ getIndex)

private:
    QString data;
    int index=0;
public:
    ScreenPreview();
    QString getData(){return data;}
    int getIndex(){return index;}
};

#endif // SCREENPREVIEW_H

Сериализация в QVariantMap:
Код:
QVariantMap MainWindow::toMap(QObject &obj)
{
    QVariantMap map;

    for(int i=0; i<obj.metaObject()->propertyCount(); ++i) {
        if(obj.metaObject()->property(i).isStored(&obj)) {
          map.insert(obj.metaObject()->property(i).name(),obj.metaObject()->property(i).read(&obj));
        }
    }

    return map;
}

Инициализация и использование:
Код:
ScreenPreview preview;
QMessageBox::information(this,"Информация",QJsonDocument::fromVariant(toMap(preview)).toJson());

Вывод:
Код:
{
   "head":"",
   "objectName":""
}
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Могу только гадать.
Не увидел [STORED true], ну наверное они есть. Улыбающийся
Попробуйте, закомментировать проверку isStored.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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