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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt,可以使用QJsonDocument和QJsonObject类来解析和处理JSON数据。 首先,需要将JSON数据转换为QJsonDocument对象。可以使用QJsonDocument::fromJson()方法将JSON字符串或字节数组转换为QJsonDocument对象。例如: ```cpp QString jsonString = "{\"name\":\"John\",\"age\":30}"; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8()); // 或者 QByteArray jsonData = "{\"name\":\"John\",\"age\":30}"; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); ``` 然后,可以通过调用`jsonDoc.object()`方法获取QJsonObject对象,以便访问和处理JSON数据的键值对。例如: ```cpp QJsonObject jsonObj = jsonDoc.object(); QString name = jsonObj["name"].toString(); int age = jsonObj["age"].toInt(); ``` 对于嵌套的JSON结构,可以通过递归方式进行解析。例如,如果JSON数据包含一个嵌套的数组: ```cpp QString jsonArrayString = "{\"people\":[{\"name\":\"John\",\"age\":30},{\"name\":\"Alice\",\"age\":25}]}"; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonArrayString.toUtf8()); QJsonObject jsonObj = jsonDoc.object(); QJsonArray peopleArray = jsonObj["people"].toArray(); foreach (const QJsonValue& value, peopleArray) { QJsonObject personObj = value.toObject(); QString name = personObj["name"].toString(); int age = personObj["age"].toInt(); // 处理每个人的数据 } ``` 以上是一个简单的JSON解析示例,根据实际情况,可能需要根据JSON数据的结构进行更复杂的处理和解析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂java杰尼龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值