Json QtNetworkReply to QByteArray
Json QtNetworkReply to QByteArray
我需要在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++
你能告诉我如何将我的"回复"转换为"回复"吗?
@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);
});
Qt5的connections语法具有对连接进行编译时验证的优点,这在使用SIGNAL
和SLOT
宏时是不存在的。
您必须连接来自回复对象或NetworkManager的finished()信号才能获得结果。您还需要使*reply成为类成员,否则您将无法在处理程序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()
这是一个重载函数。
从设备读取所有可用数据,并将其作为QByteArray。
从那里您可以使用QJsonDocument。
QJsonDocument QJsonDocument::fromBinaryData(const QByteArray&data,DataValidation validation=Validate)
根据数据创建QJsonDocument。
编辑-很抱歉,我没有资格发表评论,但我觉得TheDarkKnight提供的答案更符合"回复"的一次性性质,而且不太需要创建一个新的插槽。Lambda非常酷,编译时验证也很好。
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- C++ Singleton - Prevent ::instance() to variable
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- QByteArray filled with x....x.... to QString
- Qt - QStringList to QByteArray
- Qt C++ QString to QByteArray Conversion
- QJson QVariantMap to QByteArray
- Opencv Mat conversion to QByteArray
- Qt:<bool> QVector to QByteArray
- boost::filesystem::path to QByteArray
- QByteArray to QString to std::stringstream 不起作用
- Json QtNetworkReply to QByteArray
- QBitArray to QByteArray
- QFile to QByteArray保存文件名
- QByteArray to QString