JSON в Qt с использованием QVariantMap - PullRequest
9 голосов
/ 25 февраля 2011

Я хотел бы проанализировать этот вывод JSON в приложении для Symbian:

[
    {"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"}
]

Для этого я написал следующий код, но не могу прочитать данные. Другой одиночный вывод JSON работает нормально, но множественный вывод не работает:

     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;
}

Ответы [ 3 ]

6 голосов
/ 09 февраля 2012

В Qt 5 он поддерживает данные JSON.

"Qt предоставляет поддержку для работы с данными JSON. JSON - это формат для кодирования объектных данных, полученных из Javascript, но в настоящее время широко используемых в качестве формата обмена данными в Интернете. Поддержка JSON в Qt предоставляет простой в использовании C ++ API для анализа, изменения и сохранения данных JSON. Он также содержит поддержку для сохранения этих данных в двоичном формате, который непосредственно mmap'able и очень быстрый доступ. Более подробную информацию о формате данных JSON можно найти на сайте RFC-4627 и в нем. "

http://qt -project.org / док / кварта-5 / json.html

И я думаю, что не сложно портировать их на Qt 4, если вам нужно.

По крайней мере, вы можете найти код на https://github.com/qtproject/qtbase/tree/5.3/src/corelib/json

Кто-то портировал QJson * с 5 на 4: (добавлено 2013-07-02) https://github.com/5in4/qjson-backport

Примечание: 2012-11-30

Кто-то еще также указал, что можно использовать QtScript для анализа данных JSON. Если вы можете читать по-китайски (если не можете, пожалуйста, переведите его в Google): http://www.cuteqt.com/blog/?p=2261 (Этот сайт пока недоступен, забыл сделать резервную копию через Google Reader, а GR тоже не работает ... 2013-07 -02)

3 голосов
/ 25 февраля 2011

Вы используете парсер из https://github.com/ereilin/qt-json, верно? Насколько мне известно, этот синтаксический анализатор нуждается в ваших данных JSON, чтобы они всегда были объектом верхнего уровня, поэтому ваши данные должны выглядеть примерно так:

{"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"}
  ] }

Проверьте ответы на Лучший JSON-парсер для Qt? для некоторых альтернативных парсеров, я бы рекомендовал взглянуть на qjson (http://qjson.sourceforge.net/).

1 голос
/ 12 марта 2012
void parse_links(const QScriptValue & value, QList<Link> & cbk_links)
{
    QList<QVariantMap> list;
    qScriptValueToSequence(value,list);
    foreach(auto item, list)
    {
        Link link;

        link.yawDeg = item.value("yawDeg").toFloat();
        link.panoId = item.value("panoId").toString();
        link.road_argb = item.value("road_argb").toString();
        link.description = item.value("description").toString();
        link.scene = item.value("scene").toInt();

        cbk_links.append(link);
    }
}

используется для прохождения:

"Links":    [
            {   "yawDeg":"18.49",
                "panoId":"Voal3KQo5FNL67hq7tA8nA",
                "road_argb":"0x80ffffff",
                "description":"Knuth-Wintherfeldts Allé",
                "scene":"0"
            },          {   "yawDeg":"198.49",
                "panoId":"6RCsAsNoawmh98eOOs7Wzw",
                "road_argb":"0x80ffffff",
                "description":"Knuth-Wintherfeldts Allé",
                "scene":"0"
            }
        ]
...