QJsonDocument::toJson() 生成超大文本。有办法解决吗?

Posted

技术标签:

【中文标题】QJsonDocument::toJson() 生成超大文本。有办法解决吗?【英文标题】:QJsonDocument::toJson() generates extra large text. Is there way to fix it? 【发布时间】:2014-11-05 16:34:49 【问题描述】:

我制作了将QList<qreal>(非常大的列表)转换为 JSON 字符串的类,但它会生成一个超大的文本。

代码如下:

QJsonObject rootObject;
rootObject.insert("Test",0.05);
qDebug()<<QJsonDocument(rootObject).toJson(QJsonDocument::Compact);

我已经尝试过相同的代码:

QJsonObject rootObject;
rootObject.insert("Test",QString("0.05").toDouble());
qDebug()<<QJsonDocument(rootObject).toJson(QJsonDocument::Compact);

调试输出总是:

"Test":0.050000000000000003

我想得到这样的简短输出:

"Test":0.05

有没有办法修复QJsonDocument?或者让一些小数计数舍入/限制?

【问题讨论】:

为什么要将双精度转换为字符串,然后再转换回双精度? @Merlin069 因为我所有的输入数据都来自从 QString 转换而来的双精度值。这证明了错误不在 toDouble 转换中。 我明白了,因为你错过了传递给 QString 的 0.05 左右的引号,我没有意识到输入最初是一个字符串。我已经测试了 QVariant 并且可以正常工作,所以你说得对,json 转换是问题所在。这并不理想,但你可以写一个字符串,而不是双精度。 感谢您的尝试。是的,如果双倍没有解决方案,我将使用字符串。 你在什么平台上? 【参考方案1】:

在 OS X 上,我尝试了以下操作:-

QVariant d(0.5);
QJsonValue val = QJsonValue::fromVariant(d);

qDebug() << val.toDouble();

这打印出 0.5,正如预期的那样。

不过,我认为问题出在floating point precision。 QJSonDocument 尽可能准确地表示数字,但没有像QString 中那样限制所表示的小数位数的功能。

虽然不理想,但如果你真的想用这种方式表示 0.5,你可以写一个字符串值而不是双精度值。

【讨论】:

单个值看起来不错,但我需要获取包含名称和值的有效 json 字符串。所以我使用 QJsonArray 和 QJsonDocument 将所有转换为字符串。看起来只是 QJsonDocument 的问题。 我只需要将 QJsonObject 转换为有效的 JSON 字符串。 QJsonObject 包含这个双打并且输出很大。一些双打转换正确,但我测试了 0.5 并且它总是很大。 我认为问题在于浮点精度并相应更新了答案。

以上是关于QJsonDocument::toJson() 生成超大文本。有办法解决吗?的主要内容,如果未能解决你的问题,请参考以下文章

养生-坚果-花生:黑花生

变量的生存期和存储分配

第一章生孩子的男人

android之活动状态生存期启动模式

C语言变量的作用域和生存期问题

尊享e生守护e生健康要求严格,投保前请咨询我