记录一一个半天时间才发现的readAll()清除内存缓冲区问题
想了解Json解析的小伙伴们,先别走,获取Token以及快速上手Qt网络编程
另外关于Json数据类型及解析数组
代码是这样的,下面为了得到token值而解析某段Json数据的代码,首先qDebug() << reply->readAll();打印出了之前post得到的QByteArray类型的reply数据(注意,这里是错误的源泉)。但是之后在 if (document.isObject())这步返回的就是false,bytes打印的结果我将其赋值给了s,也就是写死了Json数据时,解析是没有问题的,这就齐了怪了,想了很久没有发现问题,之后同事帮助我找到了问题所在。
排错过程:首先既然通过reply->readAll()复制过来的s可以解析,那么不妨判断一下bytes和s是否相等呢?答案是:false,他们竟然不相等!!这是为什么?紧接着,同事建议把bytes和s的大小打印一下,结果是前者为0,然后一语中的,reply是什么类型?指针类型,那么会不会它的缓冲区被覆盖了?于是删除qDebug() << reply->readAll();成功拍错~
转念一想,打印出来看看吧。这里多打印了几遍,方便看看调用reply指针后的结果。地址没有变!!!而是reply->readAll()变空了。
后地址 QNetworkAccessManager(0x7ddad58) “{ …“X-Auth-Token”: “rkJ11UQQ5HVaKJWeS4OXIhq6GVPBR12c”, “UserId”: 2 } } }”;
中地址 QNetworkAccessManager(0x7ddad58) “”
后地址 QNetworkAccessManager(0x7ddad58) “”
看了一下readAll()函数的帮助介绍
QByteArray QIODevice::readAll()
Reads all remaining data from the device, and returns it as a byte array.
This function has no way of reporting errors; returning an empty QByteArray can mean either that no data was currently available for reading, or that an error occurred.
也就是返回空时发生错误…是的,那为啥错了啊?
然后再与同事沟通了一下,原来我们平时所用的指针内存是手动清理的,而Qt这种会考虑系统的安全性,使用一次readAll()时,就把reply清空了。这个过程有点类似于linux或操作系统课程中的管道(pipe)通信问题。
两个进程通信,目的是进程1向进程2发送:注意保暖
进程1发送之前,进程2一直在循环等待
直到进程1发送消息
然后进程2就将消息取出
都是考虑了系统的安全性问题~
完美解决~
非常感谢同事,收获颇丰~
有的时候一个bug会让你陷进去很长时间,不妨让别人帮你看看~
QString AddId::analysisSessionsJson(QNetworkReply *reply){
qDebug() << "前地址" <<reply->parent()<< reply->readAll();
qDebug() << "中地址" <<reply->parent()<< reply->readAll();
if (reply->error() == QNetworkReply::NoError) //JSON格式正确
{
QByteArray bytes = reply->readAll(); //读取所有字节;
qDebug() << "后地址" <<reply->parent()<<reply->readAll();
QByteArray s = "{ \.......\"X-Auth-Token\": \"rkJ11UQQ5HVaKJWeS4OXIhq6GVPBR12c\", \"UserId\": 2 } } }";
qDebug() << (bytes == s);
qDebug() << "************";
qDebug() << bytes.size();
qDebug() << s.size();
QJsonParseError jsonError_login;
//转化为JSON文档
QJsonDocument document = QJsonDocument::fromJson(bytes, &jsonError_login);
qDebug() << document;
// 解析Json error
qDebug() <<(document.isObject());
if (document.isObject())
{
qDebug() << "第1步";
QJsonObject obj = document.object();
QJsonValue val;
QJsonValue data_value;
if (obj.contains("Oem"))
{
qDebug() << "第2步";
QJsonObject object_value = obj.value("Oem").toObject();
if (object_value.contains("BMC")){
qDebug() << "第3步";
QJsonObject object1_value = object_value.value("BMC").toObject();
if(object1_value.contains("X-Auth-Token"))
{
qDebug() << "第4步";
QString token_val = object1_value.value("X-Auth-Token").toString();
qDebug() << tr("打印token");
qDebug() << token_val;
return token_val;
}
}
}
}
}
参考:
https://www.cnblogs.com/wuyepeng/p/9747557.html