JSON整数:大小限制


81

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

Answers:


92

JSON编号不受规范限制。

JSON编号语法

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

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


12
实际上,Javascript整数限制为大约2 ^ 53(没有整数;只有IEEE浮点数)。但是JSON规范非常清楚,JSON数字是无限大小的。
尼尔森

9
尽管答案在技术上仍然是正确的,但值得一提,因为RFC 7159有助于阐明应将哪些整数范围视为可互操作的。(即[-(2**53)+1, (2**53)-1]。)如果您在该范围之外工作,则要么使用字符串编码的整数,要么期望实现失去精度。
汤姆·克里斯蒂

@TomChristie JSON规范未提及RFC7159。
Tomalak

3
@Tomalak-当然-RFC7159随后发布(2014)。澄清了一些先前存在的不一致/边缘情况等。(例如,没有提及可行的数字范围)
Tom Christie

2
嗯,在详细阅读RFC之后,它仍然没有限制数量。它仅暗示许多系统在内部使用IEEE754,并且这一事实可能会对接收器可以解释的内容施加实际限制,这就是答案的全部含义。
Tomalak

18

RFC 7159:JavaScript对象表示法(JSON)数据交换格式

该规范允许实现对接受的数字的范围和精度设置限制。由于实现IEEE 754-2008 binary64(双精度)数字[IEEE754]的软件通常可用并得到广泛使用,因此,在期望实现的精度或范围不超过这些实现的范围内,可以实现良好的互操作性。预期精度内的数字。诸如1E400或3.141592653589793238462643383279之类的JSON数字可能表示潜在的互操作性问题,因为它表明创建它的软件期望接收软件具有比广泛使用的更大的数字幅度和精度功能。


国际海事组织(IMO)“广泛可用”是一些模糊的语言。同时,某些实现(例如Python的标准json模块)可以解析任意整数,甚至可以解析超过64位(内置bignums)的整数。
Tomasz Gandor

8

我刚刚使用Chrome(在Mac上为v.23)控制台进行了以下实证测试:

> var j = JSON.parse("[999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999]")
undefined

> j[0]
1e+228

如果JSON是通过HTTP传递的,则无论如何该数字都将由Java转换为String,那么问题可能仅在于Javascript。

根据ECMAScript语言规范4.3.19

4.3.19数值

对应于双精度64位二进制格式IEEE 754值的原始值

注意Number值是Number类型的成员,并且是数字的直接表示。

这是Wikipedia双精度浮点格式中定义的内容


2
谢谢。Java的后端Web服务正在分发这种特定的JSON结构,因此,按照@Tomalak的回答,我想我需要检查我的服务器端JSON库实际上在做什么。
伊恩·迪金森

3
而且,为了记录在案,Jackson确实将JSON输入中的长整数正确解析为Java long。
伊恩·迪金森

另外,为了记录在案,Jackson会正确发出Java long,但是至少基于Chrome的浏览器将后3个小数设置为零,即数字的长度是正确的,但后3个小数始终显示为000
Johannes Jander
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.