9

この JSON 出力をシンビアン アプリケーションで解析したいと思います。

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

3 に答える 3

6

Qt 5 では、JSON データをサポートしています。

「Qt は、JSON データを処理するためのサポートを提供します。JSON は、Javascript から派生したオブジェクト データをエンコードするための形式ですが、現在はインターネット上でデータ交換形式として広く使用されています。Qt の JSON サポートは、解析するための使いやすい C++ API を提供します。 JSON データを変更して保存します。また、このデータを直接 mmap 可能でアクセスが非常に高速なバイナリ形式で保存するためのサポートも含まれています。JSON データ形式の詳細については、RFC-4627 を参照してください。"

http://qt-project.org/doc/qt-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 リーダーでバックアップするのを忘れていました。 GRも死んだ… 2013-07-02)

于 2012-02-09T12:19:18.933 に答える
3

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

QtのベストJSONパーサーへの回答を確認しますか?いくつかの代替パーサーについては、qjson(http://qjson.sourceforge.net/)を参照することをお勧めします。

于 2011-02-25T13:22:02.687 に答える
1
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"
            }
        ]
于 2012-03-12T00:15:16.980 に答える