2017-10-20 124 views
0

我有這個JSON對象,我想訪問「持續時間」,用顯示它在控制檯上Qt來訪問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(數組,QJsonArray([{ 「contentDetails」:{ 「標題」: 「假」, 「定義」: 「HD」, 「尺寸」:「2D 「 」持續時間「: 」PT58M21S「, 」licensedContent「:真, 」投影「: 」矩形「}, 」ETAG「:」 \ 「cbz3lIQ2N25AfwNr-BdxUVxJ_QY/PkTW6UN9MH0O2kDApjC3penIiKs \」」, 「ID」: 「WkC18w6Ys7Y」, 「種類」: 「的YouTube#視頻」}]))

V2 = QJsonValue(未定義)

V3 = 「」

所以v1很好,但v2變得不確定。我做錯了什麼,我怎麼才能正確訪問「持續時間」項目?

回答

0

直接回答如下:

// 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

0

items是一個列表,所以在它上面調用toObject()只是返回默認值。根據文檔:

將該值轉換爲對象並將其返回。

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

您需要致電toArray()就可以了,它會將其轉換爲QJsonArray。從那裏,您可以使用各種方法從數組中獲取第一項,或者如果對您的模式更有意義,則可以遍歷數組。