Как получить доступ к элементу JSON, используя Qt

У меня есть этот объект Json, и я хочу получить доступ к "duration" и показать его на консоли, используя 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 (массив, QJsonArray([{"contentDetails":{"caption":"false","definition":"hd","dimension":"2d","duration":"PT58M21S","licensedContent": правда, "проекция": "прямоугольная"},"ETag":"\"cbz3lIQ2N25AfwNr-BdxUVxJ_QY/PkTW6UN9MH0O2kDApjC3penIiKs\"","идентификатор":"WkC18w6Ys7Y","вид": "YouTube видео #"}]))

v2 = QJsonValue (не определено)

v3 = ""

Итак, v1 в порядке, но v2 становится неопределенным. Что я делаю не так и как я могу правильно получить доступ к элементу "duration"?

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

items это список, поэтому вызов toObject() для него просто возвращает значение по умолчанию. Согласно документации:

Преобразует значение в объект и возвращает его.

Если type() не является Object, будет возвращено значение defaultValue.

Вам нужно вызвать toArray() для него, который преобразует его в QJsonArray. Оттуда вы можете взять первый элемент из массива, используя различные методы, или выполнить итерацию по массиву, если это имеет больше смысла для вашей схемы.

Другие вопросы по тегам