Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON in Qt using QVariantMap

I would like to parse this JSON output in a symbian application:

[
    {"ID":"9","titel":"wouter","plaatsID":"2616","prio":"3"},
    {"ID":"8","titel":"pasta","plaatsID":"3780","prio":"3"},
    {"ID":"6","titel":"Muts prikken","plaatsID":"3780","prio":"2"
    {"ID":"5","titel":"doorplannen","plaatsID":"3840","prio":"2"}
    {"ID":"4","titel":"Gasfles","plaatsID":"3780","prio":"2"}
]

For this, I wrote following code, but I can't read the data. Other single JSON output it works fine, but a multiple output doesn't work:

     void start::finishedSlot(QNetworkReply * reply)
    {
        // Reading attributes of the reply
        // e.g. the HTTP status code
        reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
    // see CS001432 on how to handle this
    // no error received?
    if (reply->error() == QNetworkReply::NoError)
    {
            QByteArray data = reply->readAll();
        bool ok;
        QVariantMap result = Json::parse(QString(data), ok).toMap();

        if(!ok) {
            qFatal("An error occurred during parsing");
            exit(1);
        }
        QMapIterator<QString, int> i(result);
        while (i.hasNext()) {
            i.next();
            cout << i.key() << ": " << i.value() << endl;
        }

    ui->log->setText("het gaat goed");
    }
    // Some http error received
    else
    {
     ui->log->setText("gaat NIET goed");
    }
    delete reply;
}
like image 711
Wouter van Reeven Avatar asked Feb 25 '11 12:02

Wouter van Reeven


2 Answers

In Qt 5, it has the support for JSON data.

"Qt provides support for dealing with JSON data. JSON is a format to encode object data derived from Javascript, but now widely used as a data exchange format on the internet. The JSON support in Qt provides an easy to use C++ API to parse, modify and save JSON data. It also contains support for saving this data in a binary format that is directly mmap'able and very fast to access. More details about the JSON data format can be found at and in RFC-4627."

http://qt-project.org/doc/qt-5/json.html

And I think it's not difficult to port them to Qt 4 if you need.

At least you can find the code at https://github.com/qtproject/qtbase/tree/5.3/src/corelib/json

Someone ported QJson* from 5 to 4:(Added 2013-07-02) https://github.com/5in4/qjson-backport

Note: 2012-11-30

Someone else also pointed that it's possible to use QtScript to parse JSON data. If you can read Chinese(if can't, please Google Translate it): http://www.cuteqt.com/blog/?p=2261 (This site is down for now, forgot to backup it via Google Reader, and GR is also dead... 2013-07-02)

like image 159
Liang Qi Avatar answered Sep 18 '22 17:09

Liang Qi


You are using the parser from https://github.com/ereilin/qt-json, right? As far as I am aware, that parser needs your JSON data to always be an object at the top-level, so your data needs to look something like

{"somename": [
  {"ID":"9","titel":"wouter","plaatsID":"2616","prio":"3"},
  {"ID":"8","titel":"pasta","plaatsID":"3780","prio":"3"},
  {"ID":"6","titel":"Muts prikken","plaatsID":"3780","prio":"2"},
  {"ID":"5","titel":"doorplannen","plaatsID":"3840","prio":"2"},
  {"ID":"4","titel":"Gasfles","plaatsID":"3780","prio":"2"}
  ] }

Check out the answers to Best JSON parser for Qt? for some alternative parsers, I'd recommend taking a look at qjson (http://qjson.sourceforge.net/).

like image 21
Greg S Avatar answered Sep 17 '22 17:09

Greg S