我正在将一些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
开头的整数,或者是否有解决问题的方法?
答案 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
背后的理由可能是:
DecimalIntegerLiteral
与HexIntegerLiteral
和OctalIntegerLiteral
。首先是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发送您号码的最简单方法是将您的号码作为字符串发送。