【问题标题】:JSON in Qt using QVariantMapQt 中的 JSON 使用 QVariantMap
【发布时间】:2011-02-25 12:47:09
【问题描述】:

我想在 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 是您尝试解析的实际数据吗?如果是这样,它包含几个问题,例如缺少花括号和一些逗号。
  • 不确定 QMapIterator 是怎么做的,但是当它解析数组时,最后一个元素是长度。我使用了 qScriptValueToSequence(value,list);

标签: json qt symbian qjson


【解决方案1】:

在 Qt 5 中,它支持 JSON 数据。

"Qt 提供了处理 JSON 数据的支持。JSON 是一种对源自 Javascript 的对象数据进行编码的格式,但现在广泛用作 Internet 上的数据交换格式。 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 数据。如果你能看中文(如果看不懂,请谷歌翻译):http://www.cuteqt.com/blog/?p=2261(本站暂时挂掉了,忘记用谷歌阅读器备份了,GR也死了……2013-07-02)

【讨论】:

    【解决方案2】:

    您正在使用来自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/)。

    【讨论】:

      【解决方案3】:
      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"
                  }
              ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        相关资源
        最近更新 更多