QT5:从json结果中“取消序列化”键/值数组的最佳效率方法

时间:2015-08-19 08:57:11

标签: php mysql json qt

我从QT开始,从php获取数据(发送mysql结果)是一场噩梦

PHP方面:

...
$rs = mysql_query( $sql );
while ($row = mysql_fetch_assoc($rs)) { 
    $result[] = $row;
}
echo json_encode(array('code'=>'OK', 'result' => $result));

女巫给出以下结果:

{"code":"OK","result":
[{"CCMGD_HOUR":"19980","CCMGD_DAY":"3"},
{"CCMGD_HOUR":"32400","CCMGD_DAY":"3"},
{"CCMGD_HOUR":"71100","CCMGD_DAY":"3"},
{"CCMGD_HOUR":"71700","CCMGD_DAY":"3"},
{"CCMGD_HOUR":"72000","CCMGD_DAY":"3"}]}

现在,QT方面:

...
QNetworkReply* reply;
QString data = (QString) reply->readAll();
QJsonDocument d = QJsonDocument::fromJson(data.toUtf8());
QJsonObject jo = d.object();

QVariantHash hash =  jo.toVariantHash();
QVariantList list = hash.value("result").toList();

但之后???如果我擅长这一点,如何迭代行和提取键(CCMGD_HOUR和CCMGD_DAY)?

我找到了如何迭代:

foreach(const QVariant &item, result){
   ...//but item has 2 items for the row:
     [0]
       key "CCMGD_HOUR"
       value "19980" 
     [1]
       key "CCMGD_DAY"
       value "3" 

     how to extract this ?
}

谢谢!

2 个答案:

答案 0 :(得分:2)

要从Json中提取值,请尝试此

QJsonDocument document = QJsonDocument::fromJson(reply->readAll());
QJsonObject jo = document.object();
foreach (const QJSonValue& value, jo["result"].toArray()) {
  QJsonObject obj = value.toObject();
  qDebug() << "CCMGD_HOUR: " << obj["CCMGD_HOUR"].toInt();
  qDebug() << "CCMGD_DAY: " << obj["CCMGD_DAY"].toInt(); 
}

答案 1 :(得分:0)

要迭代基于索引的列表,您可以执行以下操作。

for (i = list.begin(); i != list.end(); ++i)

for (int i = 0; i < list.size(); ++i)

在您的情况下,也许您应该使用map对象(它是一个关联数组)。

QVariant作为toMap方法:http://doc.qt.io/qt-5/qvariant.html#toMap

然后您可以像使用关联数组的PHP一样访问地图对象:例如list["result"][0]["CCMGD_HOUR"]