【问题标题】:JSON integers: limit on sizeJSON整数:大小限制
【发布时间】:2012-11-10 05:50:38
【问题描述】:

是否在任何地方指定了 JSON 整数的大小?我猜它们仅限于普通(32位)整数,但我找不到任何写下来的地方。我需要在 Java 中对长的标识符进行编码,所以我认为我需要将它们作为字符串存储在 JSON 中,以免有溢出的风险。

【问题讨论】:

    标签: json


    【解决方案1】:

    JSON 编号不受the spec 的限制。

    由于 JSON 是一种不专门针对 JavaScript 的抽象格式,实际的目标环境决定了可以解释的内容的边界。

    还值得注意的是,没有“JSON 整数”,它们是“数字”数据类型的子集。

    【讨论】:

    • 实际上,Javascript 整数被限制在 2^53 左右(没有整数;只有 IEEE 浮点数)。但是 JSON 规范非常清楚 JSON 数字的大小是无限的。
    • 虽然答案在技术上仍然正确,但值得更新,因为 RFC 7159 有助于阐明应该将哪些整数范围视为可互操作的。 (即[-(2**53)+1, (2**53)-1]。)如果您在该范围之外工作,那么要么使用字符串编码的整数,要么期望实现失去精度。
    • @TomChristie JSON 规范没有提及 RFC7159。
    • @Tomalak - 当然 - RFC7159 后来出现(2014 年)。澄清了一些以前存在的不一致/边缘情况等。(例如没有提到任何关于可行的数字范围)
    • 嗯,详细阅读 RFC 后,仍然没有限制数量。它只是暗示许多系统在内部使用 IEEE754,并且这一事实可能会对接收器可以解释的内容产生实际限制,这就是答案一直所说的。
    【解决方案2】:

    RFC 7159: The JavaScript Object Notation (JSON) Data Interchange Format

    此规范允许实现对范围设置限制 和接受的数字的精度。由于软件实现 IEEE 754-2008 binary64(双精度)数字 [IEEE754] 是 普遍可用和广泛使用,良好的互操作性可以 通过不期望更高的精度或范围的实现来实现 比这些提供的,在某种意义上,实现将 在预期精度内的近似 JSON 数字。一个 JSON 1E400 或 3.141592653589793238462643383279 等数字可能表示 潜在的互操作性问题,因为它表明 创建它的软件期望接收软件具有更大的 数值幅度和精度的能力比广泛 可用。

    【讨论】:

    • “广泛可用”是一些模糊的语言,IMO。同时,一些实现(如 Python 的标准 json 模块)会解析任意整数,甚至超过 64 位(内置 bignums)。
    • “广泛使用”在前面提到 IEEE754 被“广泛使用”时并没有那么模糊。
    【解决方案3】:

    我刚刚使用 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 类型的成员,并且是直接的 数字的表示。

    wikipedia Double-precision floating-point format 中定义的内容。

    【讨论】:

    • 谢谢。这个特殊的 JSON 结构是由 Java 中的后端 Web 服务分发的,所以,按照@Tomalak 的回答,我想我需要检查我的服务器端 JSON 库实际上在做什么。
    • 并且,作为记录,Jackson 确实将 JSON 输入中的长整数正确解析为 Java 长整数。
    • 另外记录一下,Jackson 正确地发出 Java longs,但至少基于 Chrome 的浏览器将最后 3 位小数设置为零,即数字的长度是正确的,但最后 3 位小数总是读取000
    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多