我需要在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;?
答案 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的连接语法具有连接编译时验证的优势,使用SIGNAL
和SLOT
宏时不存在。
答案 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非常酷,编译时验证很好。