Qt使用网络响应二进制文件解析json

Qt parsing json using network response binary

本文关键字:json 二进制文件 响应 网络 Qt      更新时间:2023-10-16

好吧,我发现了一些我不明白的东西。我正在使用QtNetworkManager向web服务发出请求。出于某种原因,我似乎无法直接从网络响应到jsondoc,我必须将其转换为字符串,然后返回到uft8?

void WebAPIengine::handleNetworkData(QNetworkReply *networkReply)
{
//No network error
if (!networkReply->error()){
    //Cast to string
    QString strReply = (QString)networkReply->readAll();
    //This works, jsonDoc will have the json response from webpage
    QJsonDocument jsonDoc = QJsonDocument::fromJson(strReply.toUtf8());
    //This doesn't work, networkReply->readAll() is said to return a QByteArray. 
    QJsonDocument jsonDoc2 = QJsonDocument::fromBinaryData(networkReply->readAll());
    QJsonObject jsonObj = jsonDoc.object();
    data = jsonObj;
}
//Network error
else{
    data["Error"] = "WebAPIengine::handleNetworkData()";
}

现在我不明白为什么jsonDoc有效,而jsonDoc2无效。有人能解释一下吗?

执行QNetworkReply->readAll()后,QNetworkReply对象将为空。因此,如果再次调用QNetworkReply->readAll()方法,将不会得到任何结果。

此外,我不明白为什么要将QNetworkReply->readAll()返回的QByteArray转换为QString,然后再将其转换回QByteArray(通过调用QString::toUtf8()),将其提供给QJsonDocument::fromJson函数。

你可以尝试这样做:

QByteArray temp = newReply->readAll();
QJsonDocument  jsonDoc = QJsonDocument::fromJson(temp); // This should work

还要确保知道JSon文档的内容,即它是映射(QJsonObject)、数组(QJSonArray)、映射数组还是以数组为值的映射。