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() 生成超大文本。有办法解决吗?的主要内容,如果未能解决你的问题,请参考以下文章