Как создать json файл qt

Обновлено: 06.07.2024

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

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


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


Для работы с 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 key) swap(QJsonObject &other) toBinaryData() toJson()

Читайте также: