Russian Qt Forum

Qt => Вопросы новичков => Тема начата: vorotislav от Декабрь 04, 2014, 09:19



Название: Qt JSON or XML
Отправлено: 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 - есть ли возможность добавить например модуль, в конкретный контроллер конкретного типа? Т.е. файл скажем есть, данные занесены, и потом по середине файла необходимо дописать новый модуль.
Заранее спасибо!


Название: Re: Qt JSON or XML
Отправлено: Пантер от Декабрь 04, 2014, 09:31
Да любой.
1, 2: Прочитал, распарсил во внутренние структуры - внес изменения, сохранил.


Название: Re: Qt JSON or XML
Отправлено: vorotislav от Декабрь 04, 2014, 09:36
Пантер, а все же, стоит ли json того, чтобы потратить на него время? Или так и работать с XML, раз более менее представляю, и могу парсить?


Название: Re: Qt JSON or XML
Отправлено: Пантер от Декабрь 04, 2014, 09:39
У Кьюта есть парсилка как xml, так и json. Лично для меня xml более знаком, но json меньше ненужного содержит. Тут решать конкретно тебе, на функционал это не повлияет. Да и перейти в дальнейшем на другой формат будет не сложно. Хоть свой бинарный пили.


Название: Re: Qt JSON or XML
Отправлено: vorotislav от Декабрь 04, 2014, 09:40
Понял! Благодарю!


Название: Re: Qt JSON or XML
Отправлено: 8Observer8 от Декабрь 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
 


Название: Re: Qt JSON or XML
Отправлено: 8Observer8 от Декабрь 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"
        }
    ]
}