Qt开发之路——Json解析过程中遇到的readAll()清除内存缓冲区问题

记录一一个半天时间才发现的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


版权声明:本文为qq_16488989原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。