error: QJsonParseError

本文探讨了从MFC迁移到Qt框架时遇到的JSON解析问题,包括Unterminated string和illegal value错误的解决方法。通过调整文件读取模式和优化数据转换过程,确保了JSON数据的正确解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的

前一段时间对加密json文件进行解读,然后将数据结果显示出来,出现了如下

  1. Unterminated string
  2. illegal value
    这两种类型错误,主要是因为要将MFC下的移植到Qt下,改用新框架。原先采用的CFile, CString,分别改为QFile, QString, QByteArray。

Unterminated string

解析json文件时候出现如下Unterminated string,无终结的字符串,然后当时傻呵呵的添加了个"\0",然后发现仍然不对。

通过对比发现读文件内容没问题,在于我设置转化过程中把大小的值缩短了导致只有部分的值进行了解析出现了未终结的字符串。

//dataByte QByteArray
//stdJson  std::string
dataByte = file.readAll();
// 第1种方式
stdJson = std::string(dataByte.constData);
//第二种方式  
stdJson = dataByte.toStdString();
stdJson = decodeFile(stdJson, keys);

第一种方式 : stdJson size 只有 674 dataByte.constData是一个const char* 指针 导致内容size的变小;
第二种方式 : stdJson size 只有 32万多 与dataByte size差不多;

illegal value

这个问题 就有点尴尬了, 我网上搜了一些 也没有怎么理解,当时还怀疑json文件是否问题,但是发现老版的读写没问题。然后我重新梳理思路,

读文件大致分为三部:

  1. 按照某个模式(读或写)打开文件 open
  2. 给对应的数据结构分配足够的内存
  3. 然后read

对比老版,发现open模式可能不对,

file.open(QIODevice::ReadOnly | QIODevice:: Text);

//后改为
file.open(QIODevice::ReadOnly);

原因:
因为我那加密文件是json类型,所以用Text 打开进行读时会按照Text模式进行读,导致读出来数据会有问题。

void Login::onLoginFinished(QNetworkReply *reply) { ui->pushButton_login->setEnabled(true); // 确保reply被正确释放 QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> replyPtr(reply); // 调试信息 int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); qDebug() << "HTTP Status:" << statusCode; if (reply->error() != QNetworkReply::NoError) { QByteArray errorResponse = reply->readAll(); qDebug() << "Error Response:" << errorResponse; QString errorMsg = QString("网络错误(%1): %2").arg(statusCode).arg(reply->errorString()); if (!errorResponse.isEmpty()) { errorMsg += "\n服务器返回: " + QString::fromUtf8(errorResponse); } ui->labelMessage->setText(errorMsg); return; } QByteArray response = reply->readAll(); qDebug() << "Response Data:" << response; QJsonParseError parseError; QJsonDocument doc = QJsonDocument::fromJson(response, &parseError); if (parseError.error != QJsonParseError::NoError) { ui->labelMessage->setText(QString("JSON解析错误: %1").arg(parseError.errorString())); return; } if (!doc.isObject()) { ui->labelMessage->setText("服务器返回数据格式错误"); return; } QJsonObject obj = doc.object(); if (obj.contains("error")) { ui->labelMessage->setText(obj["error"].toString()); } else if (obj["success"].toBool()) { QString nickname = obj["user"].toObject()["nickname"].toString(); QMessageBox::information(this, "登录成功", QString("欢迎,%1").arg(nickname)); // QDialog::accept(); // 关闭对话框 } else { ui->labelMessage->setText("登录失败: 未知错误"); } }报错HTTP Status: 0 Error Response: ""
最新发布
07-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

道阻且长,行则降至

无聊,打赏求刺激而已

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

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

打赏作者

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

抵扣说明:

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

余额充值