Json QtNetworkReply到QByteArray

时间:2015-11-04 13:57:41

标签: c++ json qt

我需要在Qt / c ++中做一个请求来获取一个JSON文件,然后解析它并填充我的对象。

请求似乎很好,并且"它看起来像"我的QtNetworkReply回复已经填满。

但经过多次尝试后,我仍然不明白如何将其转换为QbyteArray(我甚至不知道它是否是正确的做法......),能够把它转换成我的班级。

这是我的代码:

QNetworkAccessManager networkManager;
QUrl url("https://api.myjson.com/bins/uvki"); //url from a free json host
QNetworkRequest request;enter code here
request.setUrl(url);
QNetworkReply* reply = networkManager.get(request);
QByteArray reponse;

if (reply == NULL)
{
    std::cout << "Damn" << std::endl;
    exit(2);
}
reponse = reply->readAll();
if (reponse == NULL)
{
    std::cout << "i hate you" << std::endl;
    exit(1000);
}

我可能做了一些愚蠢的事情,我只有2天的c ++

你能告诉我如何转换我的回复&#34;进入我的反应&#34;?

2 个答案:

答案 0 :(得分:2)

@MichaelBoone提供的答案是正确的。

另外,使用C++11,您可以使用Qt 5的QObject::connection语法和lambda函数来简化代码

QJsonDocument document;
QNetworkReply* pReply = networkManager.get(request);

connect(reply, &QNetworkReply::finished, [=](){  

  // the reply will return here
  QByteArray response = pReply->readAll();
  document = QJsonDocument::fromBinaryData(response);

});

Qt 5的连接语法具有连接编译时验证的优势,使用SIGNALSLOT宏时不存在。

答案 1 :(得分:1)

您必须连接来自回复对象的完成()信号,或者从NetworkManager连接以获得结果。您还需要回复一个班级成员,或者您无法在您的处理程序SLOT中访问它。

QNetworkReply* reply = networkManager.get(request);
connect(reply, SIGNAL(finished()), this, SLOT(YourFunctionHere()));

void YourFunctionHere(){
    //handle the data
}

QNetworkReply是一种非阻塞功能,与大多数QT网络功能一样,它是异步的。当您到达条件if语句以检查回复时,它尚未收到来自网络的回复。

就处理后续处理而言,使用QByteArray是正确的。

  

QByteArray QIODevice :: readAll()

     

这是一个重载功能。

     

从设备读取所有可用数据,并将其作为a返回   的QByteArray。

从那里你使用QJsonDocument。

  

QJsonDocument QJsonDocument :: fromBinaryData(const QByteArray&amp; data,   DataValidation validation = Validate)

     

从数据创建QJsonDocument。

编辑 - 抱歉,我没有评论的声誉,但我觉得TheDarkKnight提供的答案更适合于&#34;回复&#34;并且不必因为必须创建新的插槽而受阻。 lambdas非常酷,编译时验证很好。