Json QtNetworkReply to QByteArray

Json QtNetworkReply to QByteArray

本文关键字:QByteArray to QtNetworkReply Json      更新时间:2023-10-16

我需要在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语法具有对连接进行编译时验证的优点,这在使用SIGNALSLOT宏时是不存在的。

您必须连接来自回复对象或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非常酷,编译时验证也很好。