Чтение файла 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. Более подробно в этой статье.