2017-10-20 120 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。从那里,您可以使用各种方法从数组中获取第一项,或者如果对您的模式更有意义,则可以遍历数组。