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

时间:2014-12-08 15:45:39

标签: json parsing 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 ",
}

如果我通过从0移除"UPC":083456789012,或将其转换为"UPC":"083456789012",来更新JSON,那么它就会生效。

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

6 个答案:

答案 0 :(得分:47)

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

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

在这种情况下,您有一个needs to be 12 digits long的UPC,可能包含前导零。我认为存储它的最佳方式是字符串。

虽然有争议。如果将它视为条形码,将前导0视为其中不可或缺的一部分,则字符串是有意义的。其他类型的条形码甚至可以包含字母字符。

另一方面。 UPC是一个数字,并且它用零填充到12位的事实可以被视为显示属性。实际上,如果你通过添加一个额外的0来将其左边填充到13位,你就会得到一个EAN代码,因为EAN是UPC的超集。
如果您有monatary金额,则可以将其显示为€ 7.30,同时将其存储为7.3,因此将产品代码存储为数字也是有意义的。

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

答案 1 :(得分:8)

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

JSON借鉴了JavaScript语法,但避免了混淆功能,因此只需使用前导零(除非后面跟.)完全禁止数字。

即使不是这种情况,也没有理由期望0在解析时02仍然在数字中,因为2"UPC":"083456789012" 是只是相同数字的差异表示(如果强制小数)。

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

{{1}}

product code是一个标识符,而不是你做数学的东西。它应该是一个字符串。

答案 2 :(得分:1)

正式来说,这是因为JSON在其DecimalIntegerLiteral制作中使用了JSONNumber

JSONNumber ::
    -_opt DecimalIntegerLiteral JSONFraction_opt ExponentPart_opt

DecimalIntegerLiteral只能以0 0开头{/ 1}}:

DecimalIntegerLiteral ::
    0
    NonZeroDigit DecimalDigits_opt

背后的理由可能是:

  • 在JSON语法中 - 重用主ECMAScript语法中的构造。
  • 在主要的ECMAScript语法中 - 更容易区分DecimalIntegerLiteralHexIntegerLiteralOctalIntegerLiteral。首先是OctalIntegerLiteral

参见此作品:

 HexIntegerLiteral ::
     0x HexDigit
     0X HexDigit
    HexIntegerLiteral HexDigit

...

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit

答案 3 :(得分:1)

UPC应采用字符串格式。对于未来,您还可以获得其他类型的UPC,例如GS128或基于字符串的产品识别码。将数据库列设置为字符串。

答案 4 :(得分:0)

如果整数在JavaScript中以0开头,则认为它是整数的八进制(基数8)值而不是十进制(基数10)值。例如:

var a = 065; //Octal Value
var b = 53;  //Decimal Value
a == b; //true

答案 5 :(得分:0)

我认为通过JSON发送您号码的最简单方法是将您的号码作为字符串发送。