JSON整数:限制大小

Ian*_*son 64 json

是否指定JSON整数有多大?我猜他们只限于正常(32位)整数,但我找不到任何记录下来的东西.我需要编码Java中长的标识符,所以我假设我需要将它们存储为JSON中的字符串,以免冒出溢出的风险.

Tom*_*lak 78

JSON编号不受规范限制.

JSON数字语法

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

值得注意的是,没有"JSON整数",它们是"Number"数据类型的子集.

  • 实际上,Javascript整数限制在大约2 ^ 53(没有整数;只有IEEE浮点数).但是JSON规范很清楚,JSON数字是无限大小的. (10认同)
  • 尽管答案在技术上仍然正确,但值得更新,因为RFC 7159有助于澄清应该将哪些整数范围视为可互操作的.(即`[ - (2**53)+ 1,(2**53)-1]`.)如果你在该范围之外工作,那么要么使用字符串编码的整数,要么期望实现失去精度. (5认同)
  • @Tomalak - 当然 - RFC7159 后来出现(2014 年)。澄清了一些先前存在的不一致/边缘情况等(例如没有提及可行的数字范围) (4认同)
  • 嗯,详细阅读RFC后,它仍然没有限制数量。它只是暗示许多系统在内部使用 IEEE754,并且这一事实可以对接收器可以解释的内容施加实际限制,这就是答案一直所说的。 (2认同)

Nol*_*lan 15

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

该规范允许实现对接受的数字的范围和精度设置限制.由于实现IEEE 754-2008二进制64(双精度)数字[IEEE754]的软件通常可用并且被广泛使用,因此可以通过期望没有比这些提供的精度或范围更多的实现来实现良好的互操作性,在某种意义上,实现将近似于JSON预期精度内的数字.诸如1E400或3.141592653589793238462643383279之类的JSON号可能表示潜在的互操作性问题,因为它表明创建它的软件期望接收软件具有比广泛可用的数字量级和精度更高的能力.


Ton*_*Rad 6

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

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

> j[0]
1e+228
Run Code Online (Sandbox Code Playgroud)

如果通过HTTP传递JSON,那么在任何情况下,数字都将从Java转换为String,然后问题可能只在Javascript中.

来自ECMAScript语言规范4.3.19:

4.3.19数值

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

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

这是维基百科双精度浮点格式中定义的内容.

  • 谢谢。这个特殊的 JSON 结构由 Java 中的后端 Web 服务分发,因此,按照@Tomalak 的回答,我想我需要检查我的服务器端 JSON 库实际上在做什么。 (2认同)
  • 而且,为了记录,[Jackson](http://jackson.codehaus.org/)确实正确地将JSON输入中的长整数解析为Java longs. (2认同)