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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt JSON or XML  (Прочитано 5099 раз)
vorotislav
Гость
« : Декабрь 04, 2014, 09:19 »

Доброго времени суток. Необходим совет. Есть данные, которые мне необходимо хранить в файле. Если представлять в XML виде, это выглядит так:
Код:
<controllers>
    <type name = "Стрелочный перевод">
        <controller name = "ОК-СП 1">
            <module name = "СП 1">
                <address> </address>
            </module>
            <module name = "СП 2">
                <address> </address>
            </module>
        </controller>
        <controller name = "ОК-СП 2">
            <module name = "СП 1">
                <address> </address>
            </module>
            <module name = "СП 2">
                <address> </address>
            </module>
        </controller>
    </type>
</controllers>
Это пример, в дальнейшем будет расширяться во все стороны - добавляться type, у каждого type будут свои controller'ы, и у каждого контроллера будут свои модули. В каком виде лучше хранить, xml или json.
Сейчас читаю про json, вроде как удобно, быстро и все дела. Но пока не могу представить данную структуру в json-формате.
И такие вопросы (они по обоим форматам):
1 - есть ли возможность редактировать ну например address у существующего модуля?
2 - есть ли возможность добавить например модуль, в конкретный контроллер конкретного типа? Т.е. файл скажем есть, данные занесены, и потом по середине файла необходимо дописать новый модуль.
Заранее спасибо!
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 04, 2014, 09:31 »

Да любой.
1, 2: Прочитал, распарсил во внутренние структуры - внес изменения, сохранил.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vorotislav
Гость
« Ответ #2 : Декабрь 04, 2014, 09:36 »

Пантер, а все же, стоит ли json того, чтобы потратить на него время? Или так и работать с XML, раз более менее представляю, и могу парсить?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Декабрь 04, 2014, 09:39 »

У Кьюта есть парсилка как xml, так и json. Лично для меня xml более знаком, но json меньше ненужного содержит. Тут решать конкретно тебе, на функционал это не повлияет. Да и перейти в дальнейшем на другой формат будет не сложно. Хоть свой бинарный пили.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vorotislav
Гость
« Ответ #4 : Декабрь 04, 2014, 09:40 »

Понял! Благодарю!
Записан
8Observer8
Гость
« Ответ #5 : Декабрь 09, 2014, 13:17 »

Цитировать
а все же, стоит ли json того, чтобы потратить на него время?
Откройте пример: C:\Qt\Qt5.3.2\Examples\Qt-5.3\json\savegame

Допустим нам нужно сохранять данные людей в файл Persons.json. Понадобятся три класса для Json: QJsonDocument, QJsonObject и QJsonArray

Сохраняем массив людей в Json файл:

main.cpp
Код
C++ (Qt)
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QFile>
#include <vector>
 
class Person
{
public:
   Person( const QString &firstName,
           const QString &lastName,
           int age ) :
       m_firstName( firstName ),
       m_lastName( lastName ),
       m_age( age ) { }
 
   QString m_firstName;
   QString m_lastName;
   int m_age;
 
   void read( const QJsonObject &json )
   {
       m_firstName = json["firstName"].toString();
       m_lastName = json["lastName"].toString();
       m_age = json["age"].toInt();
   }
 
   void write( QJsonObject &json ) const
   {
       json["firstName"] = m_firstName;
       json["lastName"] = m_lastName;
       json["age"] = m_age;
   }
};
 
int main()
{
   // Создаём массив людей
   std::vector<Person> persons;
   persons.push_back( Person( "Ivan", "Ivanov", 50 ) );
   persons.push_back( Person( "Pert", "Petrov", 21 ) );
   persons.push_back( Person( "Sergey", "Sergeev", 23 ) );
   persons.push_back( Person( "Dmitry", "Petrov", 39 ) );
   persons.push_back( Person( "Vector", "Sergeev", 25 ) );
 
   // Создаём Json массив людей
   QJsonArray personsArray;
   for( auto person : persons )
   {
       QJsonObject personObj;
       person.write( personObj );
       personsArray.append( personObj );
   }
 
   // Создаём объект "фирма" и добавляем название фирмы
   QJsonObject firmObj;
   firmObj["Name of firm"] = QString( "MyFirm" );
 
   // Добавляем массив людей в объект "фирма"
   firmObj["Persons"] = personsArray;
 
   // Создаём Json документ и добавляем в него объект "фирма"
   QJsonDocument saveDoc( firmObj );
 
   // Записываем Json документ в файл
   QFile saveFile( "Persons.json" );
   if ( !saveFile.open( QIODevice::WriteOnly ) )
   {
       qWarning( "Error: unable to open save file" );
       return 1;
   }
   saveFile.write( saveDoc.toJson() );
 
   return 0;
}
 

PersonsToFile.pro
Код
C++ (Qt)
QT += core
 
CONFIG += console c++11
 
SOURCES += \
   main.cpp
 
« Последнее редактирование: Декабрь 09, 2014, 13:21 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #6 : Декабрь 09, 2014, 13:18 »

На выходе получаем такой файл:

Persons.json
Цитировать
{
    "Name of firm": "MyFirm",
    "Persons": [
        {
            "age": 50,
            "firstName": "Ivan",
            "lastName": "Ivanov"
        },
        {
            "age": 21,
            "firstName": "Pert",
            "lastName": "Petrov"
        },
        {
            "age": 23,
            "firstName": "Sergey",
            "lastName": "Sergeev"
        },
        {
            "age": 39,
            "firstName": "Dmitry",
            "lastName": "Petrov"
        },
        {
            "age": 25,
            "firstName": "Vector",
            "lastName": "Sergeev"
        }
    ]
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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