Parsing JSON using Qt 5 framework

Hello friends!

In one of my previous posts, we had seen how to send a HTTP request using Qt. The response we got then was a JSON string. JSON is a subset of the object literal notation of JavaScript. It is basically a lightweight data-interchange format making it easy for humans to read and write. A JSON is build on two structures namely,

  • A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed list or associative array.
  • An ordered list of values. In most languages, this is realized as an array, vector, list or sequence.

A sample valid JSON looks as follows:

  • An object is an un-ordered set of name/value pairs.
  • An object begins with { (left brace) and ends with } (right brace). Each name is followed by : (colon) and the name/value pairs are separated by , (comma).
  • On the other hand, an array is an ordered collection of values. An array begins with [ (left bracket) and ends with ] (right bracket). Values are separated by , (comma).

Through this post, we will learn to parse JSON using Qt 5.

Pre-requisites: Qt Creator, MinGW compiler (Windows - 64 bit)

Launch Qt Creator and create a new Qt console application project called TestJsonParsing. Choose the default Desktop kit.

Now, let’s add our JSON parser code in the main.cpp file as follows!


#include <QCoreApplication>
#include <QDebug>
#include <QApplication>
#include <QtWebKitWidgets/QWebFrame>
#include <QtWebKitWidgets/QWebPage>
#include <QtWebKitWidgets/QWebView>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QUrlQuery>
#include <QWebSettings>
#include <QVariant>
#include <QJsonValue>
#include <QJsonDocument>
#include <QJsonObject>
#include <QVariantMap>
#include <QJsonArray>

void sendRequest();

int main(int argc, char *argv[])
    QCoreApplication a(argc, argv);
    return a.exec();

void sendRequest() {

    // create custom temporary event loop on stack
    QEventLoop eventLoop;

    // "quit()" the event-loop, when the network request "finished()"
    QNetworkAccessManager mgr;
    QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));

    // the HTTP request
    QNetworkRequest req( QUrl( QString("") ) );
    QNetworkReply *reply = mgr.get(req);
    eventLoop.exec(); // blocks stack until "finished()" has been called

    if (reply->error() == QNetworkReply::NoError) {

        QString strReply = (QString)reply->readAll();

        //parse json
        qDebug() << "Response:" << strReply;
        QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8());

        QJsonObject jsonObj = jsonResponse.object();

        qDebug() << "Time:" << jsonObj["time"].toString();
        qDebug() << "Date:" << jsonObj["date"].toString();

        delete reply;
    else {
        qDebug() << "Failure" <<reply->errorString();
        delete reply;

*.pro file

QT  += core
QT  -= gui
QT  += network
QT  += webkit webkitwidgets

TARGET = TestJsonParsing
CONFIG   += console
CONFIG   -= app_bundle


SOURCES += main.cpp

Save all changes. Build and run the application. If no errors are present then you should see the following output!


That’s it then for this useful Qt tip. Hope it helps! :)

Reference: QJsonDocument, QJsonArray