2017-06-14 83 views
0

我已经试过这段代码和工作,但我不明白如何可以得到json和转换数组或列表与Qt。 我的代码:QJsonDocument列表或数组在c + +

QEventLoop eventLoop; 


QNetworkAccessManager mgr; 
QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); 


QNetworkRequest req(QUrl(QString("http://myurljson.com/getjson"))); 

QNetworkReply *reply = mgr.get(req); 
eventLoop.exec(); // blocks stack until "finished()" has been called 

if (reply->error() == QNetworkReply::NoError) { 

    QString strReply = (QString)reply->readAll();  

    qDebug() << "Response:" << strReply; 

    QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8()); 
    QJsonObject jsonObj = jsonResponse.object(); 

    qDebug() << "test:" << jsonObj["MCC_Dealer"].toString(); 
    qDebug() << "test1:" << jsonObj["MCC_User"].toString(); 

    delete reply; 
} 
else { 
    //failure 
    qDebug() << "Failure" <<reply->errorString(); 
    delete reply; 
} 

的json得到(从网址3条):

[{ “MCC_Dealer”: '测试', “MCC_User”: '测试', “CurrentDealer”:”测试”, “当前用户”: '测试'},{ “MCC_Dealer”: '测试', “MCC_User”: '测试', “CurrentDealer”: '测试', “当前用户”: '测试'},{ “MCC_Dealer” :'test','MCC_User':'test','CurrentDealer':'test','CurrentUser':'test'}]

我需要获取json并设置为列表或数组。 我的目标是在数组或列表中使用C++和Qt转换json响应。 任何想法?

感谢

+0

您的JSON响应是一个数组。数组中的每个元素都有四个带有字符串值的JSON对象:“MCC_Dealer”,“MCC_User”,“CurrentDealer”,“CurrentUser”。请澄清一下,你想如何将它们存储在列表中。 – vahancho

+0

每一行都是一个对象,我想把它放在一个对象列表中,比如列表 obj = new List ();和obj.add(line1);等等..我来自c#,但我想这样做在c + + –

+0

好吧,但你已经有一个'QJsonArray'存储每个提到的对象。为什么你需要另一个结构(列表)来存储它们?如果你写'QJsonArray jsonArray = jsonResponse.array();'你会得到你所需要的,我想。 – vahancho

回答

2

正如我在我的评论中提到,你的JSON响应已经是一个数组,所以你并不需要创建额外的结构来存储你得到的数据。为了反序列化您的数据,您可以执行以下操作:

[..] 
QJsonArray jsonArray = jsonResponse.array(); 

for (auto it = jsonArray.constBegin(); it != jsonArray.constEnd(); ++it) 
{ 
    const QJsonValue &val = *it; 

    // We expect that array contains objects like: 
    // {"MCC_Dealer":'test',"MCC_User":'test',"CurrentDealer":'test',"CurrentUser":'test'} 
    QJsonObject o = val.toObject(); 

    // Iterate over all sub-objects. They all have string values. 
    for (auto oIt = o.constBegin(); oIt != o.constEnd(); ++oIt) 
    { 
     // "MCC_Dealer":'test' 
     qDebug() << "Key:" << oIt.key() << ", Value:" << oIt.value().toString(); 
    } 
} 
+0

正确的答案!可能直接调用一个特性?例如,如果我打电话给jsonArray [0] .key(“MCC_Dealer”)?或类似的。 –

+0

我想是的,但用不同的方式:'jsonArray [0] .toObject()但我不建议这样做,因为这样您不会检查每个函数调用返回的值的正确性,并且在某些情况下可能会失败。 – vahancho

+0

调用属性的解决方案是:convert in object,QJsonObject temp = jsonarray [n] .toObject();并调用temp.value(“yourvalue”)。toString(); - 这工作。谢谢 –