【问题标题】:Are decimals without leading zeros valid JSON?没有前导零的小数是有效的 JSON 吗?
【发布时间】:2014-11-13 07:33:55
【问题描述】:

给定 JSON 文档

{"percentageAmount": .01}

通过 JSONLint.com 运行它会导致错误:

Parse error on line 2:
..."percentageAmount": .01}
-----------------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['

另一方面,这是有效的:

{"percentageAmount": 0.01}

如果将代码作为 JavaScript 文字分配给变量,则代码会被正确解析,但是对于非 JSON 规范的 JavaScript 变量,当然有很多事情是可以的。

为什么这违反 JSON 规范?

【问题讨论】:

  • 查看number 的生产json.org
  • 因为 JSON 代表 JavaScript Object Notation,所以它是 JavaScript 的一个子集,它应该正常验证它。可能是因为 json 用于通过 .01 值无效的服务器端(php、asp)交换数据
  • 一般来说,JSON 是 Javascript 文字符号的一个大大简化的子集。
  • @albanx — 由于包含0.1 的数字集是包含.10.1 的数字集的子集,因此作为子集并不意味着.1 是有效的。 JSON 是(在正确的上下文中)有效的 JavaScript。反过来不一定正确。
  • 不仅仅是 Javascript 使用 JSON。我想知道当每个平台都有编码和解码 JSON 的功能时,人们怎么会产生这种错误......

标签: javascript json


【解决方案1】:

没有。

根据railroad diagram for numbers at JSON.org,带小数的数字必须在小数点前有数字:

【讨论】:

  • 我喜欢这些图表。这提供了答案。
  • 如果我没看错,前导 0 后跟一个数字也是无效的:即 000.1234 和 0123.45 无效。正确的?并不是说我会故意这样编码输入,但他们的规范很糟糕。
  • 这些数字在 JavaScript (SyntaxError) 中都无效,所以对我来说似乎是合理的。
  • 不过,r^\.[0-9]+$ 绝对应该得到支持。没有理由不支持它。
  • 也许显示的是旧版本的图表?现在显示的一个显示,在 0 之后,紧接在零之后的唯一字符是小数点或 e 或 E 或什么都没有。所以 0 之后的任何数字都是无效的
【解决方案2】:

没有前导零的小数是有效的 JSON 吗?

来自the specification

  number = [ minus ] int [ frac ] [ exp ]

  decimal-point = %x2E       ; .

  digit1-9 = %x31-39         ; 1-9

  e = %x65 / %x45            ; e E

  exp = e [ minus / plus ] 1*DIGIT

  frac = decimal-point 1*DIGIT

  int = zero / ( digit1-9 *DIGIT )

  minus = %x2D               ; -

  plus = %x2B                ; +

  zero = %x30                ; 0

数字的唯一必填部分是int,定义为zero1-9,后跟任意位数。

所以 JSON Lint 是正确的。

为什么这违反 JSON 规范?

据我所知,作者以这种方式定义它的原因在任何地方都没有记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2011-06-06
    • 2011-04-19
    相关资源
    最近更新 更多