Почему 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

Я думаю, что самый простой способ отправить свой номер JSON-отправить свой номер в виде строки.