【问题标题】:How to access element of JSON using Qt如何使用 Qt 访问 JSON 的元素
【发布时间】:2018-04-01 18:40:01
【问题描述】:

我有这个 Json 对象,我想访问“持续时间”并使用 Qt 在控制台上显示它:

{
 "kind": "youtube#videoListResponse",
 "etag": "\"cbz3lIQ2N25AfwNr-BdxUVxJ_QY/brZ0pmrmXldPPKpGPRM-8I4dDFQ\"",
 "pageInfo": {
  "totalResults": 1,
  "resultsPerPage": 1
 },
 "items": [
  {
   "kind": "youtube#video",
   "etag": "\"cbz3lIQ2N25AfwNr-BdxUVxJ_QY/PkTW6UN9MH0O2kDApjC3penIiKs\"",
   "id": "WkC18w6Ys7Y",
   "contentDetails": {
    "duration": "PT58M21S",
    "dimension": "2d",
    "definition": "hd",
    "caption": "false",
    "licensedContent": true,
    "projection": "rectangular"
   }
  }
 ]
}

我的 Qt 代码是这样的:

{
    QJsonDocument jsonResponse = QJsonDocument::fromJson(message);
    results = jsonResponse.object();

    QJsonValue v1 = results.value("items");

    qDebug() << "v1 = " << v1;

    QJsonValue v2 = v1.toObject().value("contentDetails");

    qDebug() <<"v2 = " << v2;

    QString v3 = v2.toObject().value("duration").toString();

    qDebug() << "v3 = " << v3;
}

但是我的输出是:

v1 = QJsonValue(array, QJsonArray([{"contentDetails":{"caption":"false","definition":"hd","dimension":"2d","duration":"PT58M21S", "licensedContent":true,"projection":"rectangular"},"etag":"\"cbz3lIQ2N25AfwNr-BdxUVxJ_QY/PkTW6UN9MH0O2kDApjC3penIiKs\"","id":"WkC18w6Ys7Y","kind":"youtube#video"}] ))

v2 = QJsonValue(未定义)

v3 = ""

所以 v1 很好,但 v2 变得未定义。我做错了什么以及如何正确访问“持续时间”项?

【问题讨论】:

    标签: c++ json qt youtube-api qjsonobject


    【解决方案1】:

    items 是一个列表,因此在其上调用toObject() 只会返回默认值。根据文档:

    将值转换为对象并返回。

    如果type()不是Object,则返回defaultValue。

    您需要在其上调用toArray(),这会将其转换为QJsonArray。从那里,您可以使用各种方法从数组中获取第一项,或者如果这对您的架构更有意义,则迭代数组。

    【讨论】:

      【解决方案2】:

      直接回答如下:

      // Read the file which has the JSON object.
      QFile file("jsonString.json");
      if(!file.open(QFile::ReadOnly)){
          qDebug()<< "Error, Cannot open the file.";
          return false;
      }
      
      QJsonDocument jsonDoc = QJsonDocument::fromJson(file.readAll());
      qDebug()<< jsonDoc.object().value("items").toArray()[0].toObject().value("contentDetails").toObject().value("duration").toString();
      

      结果: PT58M21S

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        • 2015-02-05
        • 1970-01-01
        • 2013-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多