【问题标题】:Qt: How to parse number in a jsonQt:如何解析 json 中的数字
【发布时间】:2014-12-12 08:43:18
【问题描述】:

这就是我的 json 的样子。如您所见,键ID 是一个数字。

{
   "id" : 1223324342,
   "name" : "test",
   "files"...
}

如何解析数字并将其放入数据类型为 long 的变量中?目前,这就是我所拥有的,但它存储的是 0 而不是实际值。

QJsonDocument document = QJsonDocument::fromJson(jsonData);
QJsonObject object = document.object();
product->product_id = object.value(QString("id")).toString().toLong();

【问题讨论】:

  • 我没有使用过 QJsonDocument,但是任何中途的 JSON 套件都应该返回一个 QVariant 或一些诸如“id”的值。
  • 请注意,最近在 Qt 开发人员的邮件列表中讨论了这一点,因为其他人希望读取超过 32 位的 JSON 文档中的整数。让我们看看我能不能找到它......
  • 不,找不到,抱歉。但如果我没记错的话,他们讨论了.toLongLong(补充.toInt)是否有意义,但是我不记得他们在决定不时反对的论点 来实现它。
  • 最好的方法是将您的 ID 参数作为 HEX 编码字符串传递。这样你就可以通过简单的赋值和位旋转指令来转换它。否则,通过转换十进制 -> 二进制,您会执行大量除法指令,这会增加您的时间并降低代码的性能。

标签: c++ json qt parsing qt5


【解决方案1】:

你可能想试试这个:

product->product_id = object.value(QString("id")).toVariant().toLongLong();

QVariant 很遗憾无法转换 toLong(),从其文档中可以看出。

【讨论】:

  • Qt 严格遵循JSON 标准,不幸的是即使您将值转换为QVariant,仍然不支持以64位整数开头(并且Qt将值截断为double )。
【解决方案2】:

首先,QJsonObject::value 返回 QJsonValue,而不是 QVariant。与QVariant 相比,QJsonValue 在您使用toSomeType() 函数时不会转换值,但在您请求与QJsonValue 所持有的类型不同的类型时返回默认值。

其次,JSON 不支持长整数(64 位)。事实上,它只支持整数作为双精度的“特例”。在 JavaScript 世界中,整数和浮点数基本相同(解释器可能优化整数)并且简称为“数字”。

Qt 决定支持 32 位整数作为数字的特殊情况。当值包含一个整数的双精度数时,可以访问它们(根据the documentation of QJsonValue::toInt())。从技术上讲,双精度数最多可以容纳 54 位的整数。

所以你有两个选择:

  1. 使用toInt()获取32位整数值
  2. 使用toDouble() 获取双精度值并转换为long long(当您执行toVariant().toLongLong() 时,这就是幕后发生的事情)

【讨论】:

  • “其次,JSON 不支持长整数(64 位)。事实上,它只支持整数作为双精度的“特殊情况”。这个限制适用于 javascript,大多数 JSON 的使用都希望与 javascript 进行互操作。然而,JSON 规范声明数字的限制和精度取决于实现。实现支持大于 IEEE double 的数字是完全合法的,并且有几个这样做。 QJson 不是其中之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多