【发布时间】:2012-11-10 05:50:38
【问题描述】:
是否在任何地方指定了 JSON 整数的大小?我猜它们仅限于普通(32位)整数,但我找不到任何写下来的地方。我需要在 Java 中对长的标识符进行编码,所以我认为我需要将它们作为字符串存储在 JSON 中,以免有溢出的风险。
【问题讨论】:
标签: json
是否在任何地方指定了 JSON 整数的大小?我猜它们仅限于普通(32位)整数,但我找不到任何写下来的地方。我需要在 Java 中对长的标识符进行编码,所以我认为我需要将它们作为字符串存储在 JSON 中,以免有溢出的风险。
【问题讨论】:
标签: json
JSON 编号不受the spec 的限制。
由于 JSON 是一种不专门针对 JavaScript 的抽象格式,实际的目标环境决定了可以解释的内容的边界。
还值得注意的是,没有“JSON 整数”,它们是“数字”数据类型的子集。
【讨论】:
[-(2**53)+1, (2**53)-1]。)如果您在该范围之外工作,那么要么使用字符串编码的整数,要么期望实现失去精度。
RFC 7159: The JavaScript Object Notation (JSON) Data Interchange Format
此规范允许实现对范围设置限制 和接受的数字的精度。由于软件实现 IEEE 754-2008 binary64(双精度)数字 [IEEE754] 是 普遍可用和广泛使用,良好的互操作性可以 通过不期望更高的精度或范围的实现来实现 比这些提供的,在某种意义上,实现将 在预期精度内的近似 JSON 数字。一个 JSON 1E400 或 3.141592653589793238462643383279 等数字可能表示 潜在的互操作性问题,因为它表明 创建它的软件期望接收软件具有更大的 数值幅度和精度的能力比广泛 可用。
【讨论】:
json 模块)会解析任意整数,甚至超过 64 位(内置 bignums)。
我刚刚使用 Chrome(Mac 上的 v.23)控制台进行了以下实证测试:
> var j = JSON.parse("[999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999]")
undefined
> j[0]
1e+228
如果 JSON 是通过 HTTP 传递的,那么无论如何该数字都会从 Java 转换为字符串,然后问题可能只在 Javascript 中。
来自ECMAScript Language Specification 4.3.19:
4.3.19 数值
对应于双精度 64 位二进制的原始值 格式化 IEEE 754 值
注意 Number 值是 Number 类型的成员,并且是直接的 数字的表示。
【讨论】: