如果整数以前导零开头,为什么JSON无效?

DJS*_*SrA 39 parsing json object zero parseint

我正在将一些JSON文件导入到我的Parse.com项目中,并且我不断收到错误"无效密钥:值对".

它表示存在意外的"8".

这是我的JSON的一个例子:

}
 "Manufacturer":"Manufacturer",
 "Model":"THIS IS A STRING",
 "Description":"",
 "ItemNumber":"Number12345",
 "UPC":083456789012,
 "Cost":"$0.00",
 "DealerPrice":" $0.00 ",
 "MSRP":" $0.00 ",
}
Run Code Online (Sandbox Code Playgroud)

如果我通过删除0from "UPC":083456789012,或将其转换为JSON来更新JSON "UPC":"083456789012",变为有效.

JSON真的不能接受以问题开头的整数0,或者是否有办法解决问题?

Gol*_*rol 59

前导0表示JavaScript中的八进制数.八进制数不能包含8,因此该数字无效.此外,JSON没有(正式)支持八进制数,所以正式JSON是无效的,即使数字不包含8.但是有些解析器确实支持它,这可能会导致一些混淆.其他解析器会将其识别为无效序列,并会抛出错误,尽管它们给出的确切解释可能会有所不同.

解决方案:如果您有一个数字,请不要使用前导零存储它.如果您的值必须具有前导零,请不要将其视为数字,而是将其视为字符串.用它周围的引号存储它.

在这种情况下,你有一个UPC,需要12位数字,可能包含前导零.我认为存储它的最佳方式是字符串.

但这是值得商榷的.如果将它视为条形码,将前导0视为其中不可或缺的一部分,则字符串是有意义的.其他类型的条形码甚至可以包含字母字符.

另一方面.UPC是一个数字,它的左边用零填充到12位的事实可以看作是一个显示属性.实际上,如果你通过添加一个额外的0将它左边填充到13位,你就有了一个EAN代码,因为EAN是UPC的超集.
如果您有单数量,您可以将其显示为€ 7.30,同时将其存储为7.3,因此将产品代码存储为数字也是有意义的.

但那个决定取决于你.我只能建议你使用字符串,这是我个人对这些代码的偏好,如果你选择数字,那么你必须删除它0才能使它工作.

  • 好吧,我今天肯定学到了新东西.谢谢@GolezTrol. (2认同)
  • @TJCrowder好点.它是一个可选的扩展,因此在标准中提到,但这是语义.它确实总是气馁,目前它被禁止使用标准,所以最好避免在Json和JavaScript中使用八进制数. (2认同)
  • @GolezTrol:哇,你说得对.返回并检查了ECMAScript规范列表的第1版和第2版*OctalIntegerLiteral*,没有任何明显的对冲.我的错!第3版弃用它,第5版引入严格模式将其删除. (2认同)

Que*_*tin 8

JavaScript中一个比较令人困惑的部分是,如果一个数字以a 0后面没有紧跟a开头.,则表示八进制,而不是十进制.

JSON借鉴了JavaScript语法,但避免了令人困惑的功能,所以简单地禁止带有前导零的数字(除非后面跟着a .).

即使不是这种情况,也没有理由期望在0解析之后它仍然在数字中02并且2只是相同数字的差异表示(如果强制小数).

如果前导零对您的数据很重要,那么您可能有一个字符串而不是数字.

"UPC":"083456789012"
Run Code Online (Sandbox Code Playgroud)

一个产品代码是一个标识符,不是你做数学的东西.它应该是一个字符串.