JSON в Qt

Я тут заметил что в документации Qt разобран чрезвычайно переусложненный пример по работе с JSON https://doc.qt.io/qt-5.9/qtcore-json-savegame-example.html

А дело было так: мне для нужен простой способ сохранять некую информацию в своей проге, эта информация имеет подкатегории тк кк записывается несколько раз в день. Тк вот было бы удобно если бы дата записывалась в категорию, а вся инфа в подкатегории этой даты.

Ну например так (инфа абсолютно рандомна и не имеет смысла):

Итак при первом взгляде на это безобразие становиться абсолютно не понятно что тут и для чего.

Для работы с JSON в Qt сделано целых 7 классов, когда мне всего лишь нужно сделать удобно читаемый список с подкатегориями.

Для этой цели неплохо бы подошел ini который использовать на порядок проще тк кк ini как раз содержит [Категорию] и значение в ней. Но по необъяснимым причинам ini в Qt не умеет в кирилицу, и чтобы я не делал я получаю кракозябры(в гугле выясняется что это действительно существующая проблема и тролтеч забили на все кроме латиницы)

Итак начнем с QJsonValue.

QJsonValue это просто одно значение json которое может быть следующих форматов

Далее уже что-то полезное QJsonObject.

QJsonObject это одна или несколько пар ключ::значение в одном из вышеупомянутых форматов.

Вот пример использования

jsonObj будет выглядеть так

Также добавлять значения можно так

(Да они отсортированы)

Идем по нарастающей теперь QJsonArray.

QJsonArray это как нетрудно догадаться массив из QJsonObject

Добавим в него по отдельности 2 предыдущих примера.

И тадаам теперь они оба тут

Обратите внимание что массив в квадратных скобках []

Все это до сих пор не то, мне то нужны подкатегории, а не безымянные блоки данных. И тут в игру вступает немного магии, также как QJsonArray может содержать в себе несколько QJsonObject, так и QJsonObject может содержать в себе несколько QJsonObject. То есть с логической точки зрения мы будем по ключю хранить не значение, а другой объект со значениями.

Попробуем дать обоим блокам названия:

Итак получается мы создаем глобальный объект GBjsonObj и помещаем в него 2 других объекта по ключам name и age и получаем то что и требовалось

Для скорости работы функций парсинга json автоматически сортируется по алфавиту.

Ну и пожалуй самое основное — сохранение и загрузка

Для этого нам потребуется уже четвертый Qt класс QJsonDocument.

QJsonDocument как бы хранит в себе всю структуру нашего JSON, редактировать его напрямую нельзя, мы только можем поместить в него массив или объект:

Или обратно достать из документа объект:

Напишем 2 простейшие функции для работы с файлами load и save.

load() будет принимать название или путь к файлу, и возвращать json документ, Ну а save разумеется принимать документ и название/путь.

Ну и теперь как это выглядит на практике:

Ну пожалуй все. Может быть когда-нибудь напишу статью как все это дело парсить, но помойму это очевидно прямо из последнего примера.

У всех этих четырех объектов есть также куча классных методов и свойст типа

is(Любой типа данных) для проверки типа данных

isEmpty для проверки на пустоту

и другие

toVariantHash() toVariantMap() size() length() find(const QString &key)

contains(QLatin1String keyswap(QJsonObject &othertoBinaryData() toJson()

Войти с помощью: 
avatar
5000