Evgenii Legotckoi
Evgenii Legotckoi2. Januar 2016 10:33

Qt/C++ - Lektion 041. JSON-Datei – So rufen Sie die Site ab und analysieren sie

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.

Videoanleitung

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken