Beim Schreiben des EColor -Programms erschien eine Aufgabe, bei der es notwendig war, den Benutzer irgendwie zu benachrichtigen, dass eine neue Version des Programms veröffentlicht wurde. Die Lösung für dieses Problem war das Vorhandensein einer JSON -Datei auf der Website. Mit QNetworkAccessManager erhalten wir eine JSON -Datei und parsen sie dank der Qt -Bibliotheksklassen: QJsonDocument, QJsonObject, QJsonArray. Im Fall des EColor -Programms enthält die Site eine JSON -Datei mit dem Namen des Programms, die vollständige Version in einer Zeichenfolgenversion und drei Objekte mit dem Hauptteil der -Version, die Minor- und die Patch-Version. Beim Parsen der Datei wird die aktuelle Version des Programms mit derjenigen verglichen, die sich auf der Website befindet. Wenn eine neuere Version auf der Website veröffentlicht wird, informiert das Programm den Benutzer darüber.
Zum Beispiel unter der Adresse http://www.evileg.ru/it_example.json die Seite enthält eine JSON -Datei mit folgendem Inhalt:
{ "departament": "it", "employees": [ {"firstName": "John", "lastName": "Doe"}, {"fisrtName": "Michael", "lastName": "Smith"}, {"firstName": "Anna", "lastName": "Jones"} ], "number" : 3 }
Das Stammobjekt der Datei enthält drei Objekte, von denen das zweite ein Array ist. Das erste Objekt ist die String-Eigenschaft "departament" , die den Namen der Abteilung enthält. Das zweite Objekt ist ein Array mit Vor- und Nachnamen von Mitarbeitern. Und das dritte Objekt ist die Anzahl der Mitarbeiter vom Typ Integer .
Projektstruktur zum Parsen von JSON
- JSONParser.pro - Projektprofil;
- main.cpp - Hauptquellcodedatei des Projekts;
- widget.h - Header-Datei des Anwendungsfensters, die das Feld QTextEdit enthält, in dem das Ergebnis der Dateianalyse abgelegt wird;
- widget.cpp - Quellcodedatei mit QNetworkAccessManager.
- widget.ui - Programmschnittstellendatei.
JSONParser.pro
Vergessen Sie nicht, das Modul network in das Projektprofil aufzunehmen, damit Sie mit der Klasse QNetworkAccessManager. arbeiten können.
#------------------------------------------------- # # Project created by QtCreator 2016-01-02T13:12:55 # #------------------------------------------------- QT += core gui network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = JSONParser TEMPLATE = app SOURCES += main.cpp\ widget.cpp HEADERS += widget.h FORMS += widget.ui
Widget.h
Wir verbinden die Klasse QNetworkAccessManager , auch deklariert in der Header-Datei SLOT onResult(QNetworkReply *reply) , die parsen wird * JSON *-Datei, wenn eine Antwort von der Website mit dem Inhalt der Datei empfangen wird.
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QNetworkAccessManager> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private slots: // Обработчик данных полученных от объекта QNetworkAccessManager void onResult(QNetworkReply *reply); private: Ui::Widget *ui; QNetworkAccessManager *networkManager; }; #endif // WIDGET_H
Widget.cpp
Der Prozess besteht darin, ein QJsonDocument -Objekt zu erstellen und den Inhalt der QNetworkReply. -Antwort darauf zu schreiben. Dann nehmen wir das Root-Objekt root aus dem Dokument, das alle drei Eigenschaften enthält. Danach nehmen wir ihre Werte durch die Namen der Eigenschaften. Aus der zweiten Eigenschaft "employes" nehmen wir ein Array mit den Vor- und Nachnamen der Mitarbeiter der Abteilung. Alle Daten werden im Feld ui->textEdit platziert.
#include "widget.h" #include "ui_widget.h" #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QUrlQuery> #include <QNetworkReply> #include <QUrl> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); networkManager = new QNetworkAccessManager(); // Подключаем networkManager к обработчику ответа connect(networkManager, &QNetworkAccessManager::finished, this, &Widget::onResult); // Получаем данные, а именно JSON файл с сайта по определённому url networkManager->get(QNetworkRequest(QUrl("http://www.evileg.ru/it_example.json"))); } Widget::~Widget() { delete ui; } void Widget::onResult(QNetworkReply *reply) { // Если ошибки отсутсвуют if(!reply->error()){ // То создаём объект Json Document, считав в него все данные из ответа QJsonDocument document = QJsonDocument::fromJson(reply->readAll()); // Забираем из документа корневой объект QJsonObject root = document.object(); /* Находим объект "departament", который располагается самым первым в корневом объекте. * С помощью метода keys() получаем список всех объектов и по первому индексу * забираем название объекта, по которому получим его значение * */ ui->textEdit->append(root.keys().at(0) + ": " + root.value(root.keys().at(0)).toString()); // Второе значение пропишем строкой QJsonValue jv = root.value("employees"); // Если значение является массивом, ... if(jv.isArray()){ // ... то забираем массив из данного свойства QJsonArray ja = jv.toArray(); // Перебирая все элементы массива ... for(int i = 0; i < ja.count(); i++){ QJsonObject subtree = ja.at(i).toObject(); // Забираем значения свойств имени и фамилии добавляя их в textEdit ui->textEdit->append(subtree.value("firstName").toString() + " " + subtree.value("lastName").toString()); } } // В конце забираем свойство количества сотрудников отдела и также выводим в textEdit ui->textEdit->append(QString::number(root.value("number").toInt())); } reply->deleteLater(); }
Insgesamt
Als Ergebnis der Arbeit dieses Programmcodes wird das folgende Ergebnis erhalten, das in der folgenden Abbildung unten gezeigt wird. Wie die Anwendung funktioniert, können Sie auch im Video-Tutorial sehen.