Чтение файла Json по средствам Qt
Получение данных в Json файл через встроенные классы Qt для работы с Json файлом.
Полноценную поддержку с Json в Qt появилась в 5.0 версии и реализована через QJsonObject class.
Рассмотрим пример получения данных из файла Json со следующим содержимом:
test.json
{
"hello": "world",
"t": true,
"f": false,
"n": null,
"i": 123,
"pi": 3.1416,
"a": [1, 2, 3, 4]
}
Для начала прочитаем весь файл в QString.
#include <QFile>
QString val;
QFile file;
file.setFileName("test.json");
file.open(QIODevice::ReadOnly | QIODevice::Text);
val = file.readAll();
file.close();
Получаем объект и парсим значения:
#include <QJsonObject> #include <QJsonDocument> #include <QJsonArray> QJsonDocument doc = QJsonDocument::fromJson(val.toUtf8()); QJsonObject json = doc.object(); QString str = json["hello"].toString(); bool t = json["t"].toBool(); bool f = json["f"].toBool(); bool n = json["n"].toBool(); int i = json["i"].toInt(); double pi = json["pi"].toDouble(); QJsonArray ar = json["a"].toArray(); QList <QVariant> at = ar.toVariantList();
Рассмотрим вариант посложнее:
test_2.json
{
"test": {
"key1":"message1",
"key2": "message2"
},
"hello": "world",
"test2": {
"a": [1,2,3],
"t": true,
"test3": {
"i": 123,
"pi": 3.14
}
}
}
Читаем файл также, как и ранее:
#include <QFile>
QString val;
QFile file;
file.setFileName("test_2.json");
file.open(QIODevice::ReadOnly | QIODevice::Text);
val = file.readAll();
file.close();
Здесь мы рассмотрим применение класса обработчика ошибок QJsonParseError, который сообщит о наличии ошибок при обработке документа. Также добавили проверки на валидность.
Парсим объекты и значения:
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonParseError>
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(val.toUtf8(), &error);
qDebug() << "Error: " << error.errorString() << error.offset << error.error;
if (doc.isObject())
{
QJsonObject json = doc.object();
QJsonValue test = json.value("test");
if (test.isObject())
{
QJsonObject obj = test.toObject();
QString msg1 = obj["key1"].toString();
QString msg2 = obj["key2"].toString();
}
QString str = json["hello"].toString();
QJsonValue test2 = json.value("test2");
if (test2.isObject())
{
QJsonObject obj2 = test2.toObject();
QJsonArray ar = obj2["a"].toArray();
bool t = obj2["t"].toBool();
QJsonValue test3 = obj2.value("test3");
if (test3.isObject())
{
QJsonObject obj3 = test3.toObject();
int i = obj3["i"].toInt();
double pi = obj3["pi"].toDouble();
}
}
}
И последний вариант для закрепления:
test_3.json
{
"f": true,
"test": [
{
"ID": 1,
"PropertyName": "test1",
"key": "12345678"
},
{
"ID": 2,
"PropertyName": "test2",
"key": "432456675"
},
{
"ID": 3,
"PropertyName": "test3",
"key": "098776554"
}
]
}
Парсим объекты и значения:
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonParseError>
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(val.toUtf8(), &error);
qDebug() << "Error: " << error.errorString() << error.offset << error.error;
if (doc.isObject())
{
QJsonObject json = doc.object();
bool f = json["f"].toBool();
QJsonArray jsonArray = json["test"].toArray();
foreach (const QJsonValue & value, jsonArray)
{
if (value.isObject())
{
QJsonObject obj = value.toObject();
int id = obj["ID"].toInt();
QString PropertyName = obj["PropertyName"].toString();
QString key = obj["key"].toString();
}
}
}
Стандартная библиотека уступает по скорости и возможности другим библиотекам и подходит для небольших файлов. Я бы порекомендовал использовать RapidJSON. Более подробно в этой статье.
