Почему JSON недействителен, если целое число начинается с 0
я импортирую некоторые файлы JSON в свой Parse.com проект, и я продолжаю получать ошибку "недопустимый ключ: пара значений".
в нем говорится, что есть неожиданный "8".
вот пример моего JSON:
}
"Manufacturer":"Manufacturer",
"Model":"THIS IS A STRING",
"Description":"",
"ItemNumber":"Number12345",
"UPC":083456789012,
"Cost":".00",
"DealerPrice":" .00 ",
"MSRP":" .00 ",
}
если я обновляю JSON, либо удаляя 0
С "UPC":083456789012,
или преобразование его в "UPC":"083456789012",
оно вступает в силу.
может ли JSON действительно не принимать целое число, начинающееся с 0
, или есть способ обойти проблема?
спасибо,
6 ответов
ведущее 0 указывает восьмеричное число в JavaScript. Восьмеричное число не может содержать 8, поэтому это число недопустимо. Кроме того, JSON (официально) не поддерживает восьмеричные числа, поэтому формально JSON недействителен, даже если число не будет содержать 8. Однако некоторые Парсеры поддерживают его, что может привести к некоторой путанице. Другие Парсеры распознают его как недопустимую последовательность и выдадут ошибку, хотя точное объяснение, которое они дают, может отличаться.
устранение: если у вас есть номер, никогда не храните его с ведущими нулями. Если у вас есть значение, которое должно иметь начальный ноль, не рассматривайте его как число, а как строку. Храните его в кавычках.
в этом случае у вас есть UPC, который должно быть 12 цифр длиной и может содержать ведущие нули. Я думаю, что лучший способ сохранить его - это как строку.
хотя это спорно. Если вы относитесь к нему как к штрих-коду, рассматривая ведущий 0 как его неотъемлемую часть, тогда строка имеет смысл. Другие типы штрих-кодов могут даже содержать алфавитные символы.
С другой стороны. UPC-это число, и тот факт, что оно заполнено нулями до 12 цифр, можно рассматривать как свойство отображения. На самом деле, если вы оставите его до 13 цифр, добавив дополнительный 0, у вас есть код EAN, потому что EAN-это суперсет UPC.
Если у вас есть сумма monatary, вы можете отобразить ее как € 7.30
, в то время как вы храните его как 7.3
, поэтому также имеет смысл хранить код продукта в виде числа.
но это решение зависит только от вас. Я могу только посоветовать вам использовать строку, которая является моим личным предпочтением для этих кодов, и если вы выберете номер, то вам придется удалить 0
чтобы заставить его работать.
одна из наиболее запутанных частей JavaScript заключается в том, что если число начинается с 0
это не сразу следует за .
, Он представляет восьмеричный, а не десятичный.
JSON заимствует из синтаксиса JavaScript, но избегает запутанных функций, поэтому просто запрещает числа с ведущими нулями (если только за ними не следует .
) вчистую.
даже если это было не так, не было бы никаких оснований ожидать 0
в число, когда это было разбирается с 02
и 2
- это просто разностные представления одного и того же числа (если вы заставляете decimal).
если ведущий ноль важен для ваших данных, то у вас, вероятно, есть строка, а не число.
"UPC":"083456789012"
A код - это идентификатор, а не то, с чем вы занимаетесь математикой. Это должна быть струна.
формально, это потому, что JSON использует DecimalIntegerLiteral
в своем JSONNumber
производство:
JSONNumber ::
-_opt DecimalIntegerLiteral JSONFraction_opt ExponentPart_opt
и DecimalIntegerLiteral
может начинаться только с 0
если это 0
:
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits_opt
обоснование этого, вероятно, таково:
- в грамматике JSON-для повторного использования конструкций из основной грамматики ECMAScript.
- в основной грамматике ECMAScript-чтобы было легче различать
DecimalIntegerLiteral
СHexIntegerLiteral
иOctalIntegerLiteral
.OctalIntegerLiteral
в первом место.
смотрите эту постановку:
HexIntegerLiteral ::
0x HexDigit
0X HexDigit
HexIntegerLiteral HexDigit
...
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
UPC должен быть в строковом формате. В будущем вы также можете получить другой тип UPC, такой как gs128 или строковые коды идентификации продукта. Установите столбец DB в строку.
Если целое число начинается с 0
в JavaScript считается восьмеричным (base 8) значением целого числа вместо десятичного (base 10) значения. Например:
var a = 065; //Octal Value
var b = 53; //Decimal Value
a == b; //true