Qt中使用QVariantMap处理JSON

9

我想在Symbian应用程序中解析这个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;
}

你问题中的JSON数据是你要解析的实际数据吗?如果是,它包含了一些问题,例如缺少一个花括号和一些逗号。 - Greg S
不确定QMapIterator的工作原理,但在解析数组时,最后一个元素是长度。我使用了qScriptValueToSequence(value,list)函数。 - Poul K. Sørensen
4个回答

6
在Qt 5中,它支持JSON数据。
"Qt提供了处理JSON数据的支持。JSON是一种编码自Javascript的对象数据格式,但现在广泛用作互联网上的数据交换格式。 Qt中的JSON支持提供了一个易于使用的C++ API来解析、修改和保存JSON数据。它还包含支持将此数据保存为可直接映射且非常快速访问的二进制格式。 有关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 Reader备份它了,而GR也死了... 2013-07-02)

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

请查看Best JSON parser for Qt?中的答案,了解一些备选解析器,我建议您看一下qjson(http://qjson.sourceforge.net/)。


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

0
您正在尝试迭代QVariantMap,如下所示:
QMapIterator<QString, int> i(result);
...但是QVariantMap是基于变量的,因此您需要:
QMapIterator<QString, QVariant> i(result);

然后,在循环中,您可以像这样访问int值:
cout << i.key() << ": " << i.value().toInt() << endl;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接