Чтение файла Json в Qt

Автор: | 22 июля, 2019

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