2016-12-09 49 views
0

使用QT5并试图分析JSON为什么不能通过qt解析这个json?

这里的功能:

void MainWindow::parse(QString &json){ 

    QJsonDocument doc(QJsonDocument::fromJson(json.toUtf8())); 
    QJsonObject obj = doc.object(); 
    QJsonArray result = obj["results"].toArray(); 
    QJsonValue location =result.at(0); 
    QJsonValue now = result.at(1); 
    QJsonValue time = result.at(2); 
    cityName = location.toObject().take("name").toString(); 
    status = now.toObject().take("text").toString(); 
    qDebug()<<time.toString(); // this qdebug is for testing 
} 

的JSON的QString看起来是这样的:

{ 
    "results": [ 
     { 
      "location": { 
       "id": "WX4FBXXFKE4F", 
       "name": "北京", 
       "country": "CN", 
       "path": "北京,北京,中国", 
       "timezone": "Asia/Shanghai", 
       "timezone_offset": "+08:00" 
      }, 
      "now": { 
       "text": "晴", 
       "code": "0", 
       "temperature": "-4" 
      }, 
      "last_update": "2016-12-09T23:25:00+08:00" 
     } 
    ] 
} 

我期待qDebug输出为"2016-12-09T23:25:00+08:00",但它只是""

而且citynamestatus竟然设置为""

这里有什么问题?谢谢!

+1

你有没有检查'result.size()' ?你是否尝试通过并检查'QJsonDocument :: fromJson'中的'QJsonParseError * error'? – Jarod42

+1

用调试器遍历代码并检查变量值。如果你不能通过它来弄明白,那么在每个语句之间添加调试打印,并用该代码编辑问题,并且它是完整的输出。 – hyde

回答

3

在您的JSON字符串中,"results"是一个对象数组,每个对象都有键"location","now""last_update"。并且每个"location""now"是用不同的密钥JSON对象。

您正在访问的结果对象,如果它是一个数组,你应该使用按键,让你值访问作为一个对象正在寻找:

QJsonDocument doc(QJsonDocument::fromJson(jsonByteArray)); 
QJsonObject obj = doc.object(); 
QJsonArray results = obj["results"].toArray(); 
//get the first "result" object from the array 
//you should do this in a loop if you are looking for more than one result 
QJsonObject firstResult= results.at(0).toObject(); 
//parse "location" object 
QJsonObject location= firstResult["location"].toObject(); 
QString locationId= location["id"].toString(); 
QString locationName= location["name"].toString(); 
QString locationCountry= location["country"].toString(); 
QString locationPath= location["path"].toString(); 
QString locationTimeZone= location["timezone"].toString(); 
QString locationTimeZoneOffset= location["timezone_offset"].toString(); 
//parse "now" object 
QJsonObject now= firstResult["now"].toObject(); 
QString nowText= now["text"].toString(); 
QString nowCode= now["code"].toString(); 
QString nowTemperature= now["temperature"].toString(); 
//parse "last_update" 
QString lastUpdate= firstResult["last_update"].toString(); 
相关问题