QJsonDocument 解析 json字符串遇到的问题

王桑的一天 2019-08-05 11:28:28
我是按下面这种方式请求解析Json数据,大多接口数据都解析正常。
直到遇到一个数据量比较大的接口,大概有几百K,解析不出来,且没有任何错误,加了try... catch(exception &e) 输出也显示没错误。
我把reply->readAll().toStdString() print出来,是能看到里面的 json内容的,说明数据是收到的。
json的内容是这个样子,里面有一个长度为65535的数组
这是怎么回事呢?为什么解析不出Json


{
"code": 0,
"result":
{
"ID": 12,
"Data": [ // 长度为 65535 的数组
2.21,
53.21,
...
58.3,
3.33
]
}



void MainWindow::get_data()
{
manager=new QNetworkAccessManager(this);
QNetworkRequest request;
auto url = QUrl(QString("http://127.0.0.1:xxxxxx"))
request.setUrl(url);
connect(manager, &QNetworkAccessManager::finished, this, &MainWindow::append_device);
manage.get(request);
}

void MainWindow::append_device(QNetworkReply *reply)
{
QJsonParseError *err;
QByteArray data = reply->readAll();
qDebug() << data.toStdString();
QJsonObject obj = QJsonDocument::fromJson(data, err).object();
qDebug() << obj; // 不会执行到这里,但没有任何错误 , 上面解析Json那句try ...catch (exception &e)也捕获不到任何错误
qDebug() << err.errorString();
}


...全文
2189 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
注意字符编码,中文如果gb2312和utf8混搭也会出问题。读过2兆的大文件,木有问题。
王桑的一天 2019-08-06
  • 打赏
  • 举报
回复
引用 6 楼 yhgaven 的回复:
[quote=引用 2 楼 管理員 的回复:]
[quote=引用 1 楼 yhgaven 的回复:]
QJsonDocument docu;
docu = docu.fromJson(arr,0);
QVariantMap root = docu.toVariant().toMap();

int code = root.value("code").toInt();

QVariantList list = root["data"].toList();
qDebug() << "list.size = " << list.size();
int i = 0;
foreach (QVariant item, list) {
QVariantMap map1 = item.toMap();
qDebug() << "fcmp_score==" << map1.value("fcmp_score").toString();
}

这代码,和我的问题对不上吧。。。“, docu是空的[/quote]
docu.fromJson(arr,0);你换成你的参数data啊,然后看能不能先解析出code[/quote]
谢谢
王桑的一天 2019-08-06
  • 打赏
  • 举报
回复
引用 5 楼 弓人水 的回复:
reply->readAll()获取数据的用法没有问题。
试试用浏览器去获取这个网络接口的数据是否完整呢?

找到问题了,是能解析出来的,也是正确的,但是无法输出这个QJsonObject 的,也无法输出里面的Data, 像这样:

qDebug() << obj.value("Data").toArray(); // 不会输出, 实际是有值的,size() 为 65535

无法打印出来,让我以为没有解析成功。网上看了一下,好像说qDebug() 有limit 限制?
弓人水 2019-08-06
  • 打赏
  • 举报
回复
reply->readAll()获取数据的用法没有问题。
试试用浏览器去获取这个网络接口的数据是否完整呢?
yhgaven 2019-08-06
  • 打赏
  • 举报
回复
引用 2 楼 管理員 的回复:
[quote=引用 1 楼 yhgaven 的回复:] QJsonDocument docu; docu = docu.fromJson(arr,0); QVariantMap root = docu.toVariant().toMap(); int code = root.value("code").toInt(); QVariantList list = root["data"].toList(); qDebug() << "list.size = " << list.size(); int i = 0; foreach (QVariant item, list) { QVariantMap map1 = item.toMap(); qDebug() << "fcmp_score==" << map1.value("fcmp_score").toString(); }
这代码,和我的问题对不上吧。。。“, docu是空的[/quote] docu.fromJson(arr,0);你换成你的参数data啊,然后看能不能先解析出code
yhgaven 2019-08-05
  • 打赏
  • 举报
回复
QJsonDocument docu; docu = docu.fromJson(arr,0); QVariantMap root = docu.toVariant().toMap(); int code = root.value("code").toInt(); QVariantList list = root["data"].toList(); qDebug() << "list.size = " << list.size(); int i = 0; foreach (QVariant item, list) { QVariantMap map1 = item.toMap(); qDebug() << "fcmp_score==" << map1.value("fcmp_score").toString(); }
王桑的一天 2019-08-05
  • 打赏
  • 举报
回复
引用 3 楼 弓人水 的回复:
1、贴出来的JSON数据缺少一个大括号;
2、QJsonParseError *err;这个用法是错的,fromJson(data, err)肯定会空指针异常,正确用法如下。

[/code]

不好意思,我是凭记忆打的代码。这两个地方都没有问题,Json格式OK, QJsonParseError 用法和你讲的一样。

我仔细看了一下输出,好像是这句有问题

QByteArray data = reply->readAll();
qDebug() << data.toStdString();

明明用了readAll(), 但data.toStdString() 输出的数据不完整,后面的数组不完整。
readAll() 有可能只读出部分数据吗?
还有一个点,这个http接口数据是用gzip压缩的,但应该没关系啊,其它接口数据也都gzip压缩了,就这个接口数据出问题呢?
弓人水 2019-08-05
  • 打赏
  • 举报
回复
1、贴出来的JSON数据缺少一个大括号;
2、QJsonParseError *err;这个用法是错的,fromJson(data, err)肯定会空指针异常,正确用法如下。

void MainWindow::append_device(QNetworkReply *reply)
{
QJsonParseError err;
QByteArray data = reply->readAll();
qDebug() << data;
QJsonObject obj = QJsonDocument::fromJson(data, &err).object();
qDebug() << obj; // 不会执行到这里,但没有任何错误 , 上面解析Json那句try ...catch (exception &e)也捕获不到任何错误
qDebug() << err.errorString();
}
王桑的一天 2019-08-05
  • 打赏
  • 举报
回复
引用 1 楼 yhgaven 的回复:
QJsonDocument docu; docu = docu.fromJson(arr,0); QVariantMap root = docu.toVariant().toMap(); int code = root.value("code").toInt(); QVariantList list = root["data"].toList(); qDebug() << "list.size = " << list.size(); int i = 0; foreach (QVariant item, list) { QVariantMap map1 = item.toMap(); qDebug() << "fcmp_score==" << map1.value("fcmp_score").toString(); }
这代码,和我的问题对不上吧。。。“, docu是空的

16,202

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧