Подтвердить что ты не робот

Почему JSON недействителен, если целое число начинается с нуля?

Я импортирую некоторые файлы 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 ",
}

Если я "UPC":083456789012, JSON, удалив 0 из "UPC":083456789012, или преобразовав его в "UPC":"083456789012", он станет действительным.

Может ли JSON действительно не принимать целое число, которое начинается с 0, или есть способ обойти проблему?

4b9b3361

Ответ 1

Ведущий 0 обозначает восьмеричное число в JavaScript. Восьмеричное число не может содержать 8; следовательно, этот номер недействителен. Более того, JSON (официально) не поддерживает восьмеричные числа, поэтому формально JSON является недействительным, даже если число не содержит 8. Однако некоторые парсеры поддерживают его, что может привести к некоторой путанице. Другие парсеры распознают его как недопустимую последовательность и выдают ошибку, хотя точное объяснение, которое они дают, может отличаться.

Решение: Если у вас есть число, никогда не храните его с ведущими нулями. Если у вас есть значение, которое должно иметь начальный ноль, не обрабатывайте его как число, а как строку. Храните его в кавычках.

В этом случае у вас есть UPC, который должен быть длиной 12 цифр и может содержать начальные нули. Я думаю, что лучший способ сохранить это как строка.

Это спорно, хотя. Если вы рассматриваете его как штрих-код, рассматривая начальный 0 как его неотъемлемую часть, тогда строка имеет смысл. Другие типы штрих-кодов могут даже содержать буквенные символы.

С другой стороны. UPC - это число, и тот факт, что он дополнен нулями до 12 цифр, можно рассматривать как свойство отображения. На самом деле, если вы добавите до 13 цифр, добавив 0, вы получите код EAN, потому что EAN - это расширенный набор UPC.

Если у вас есть денежная сумма, вы можете отобразить ее как € 7.30, а сохранить ее как 7.3, поэтому также имеет смысл хранить код продукта в виде числа.

Но это решение за вами. Я могу только посоветовать вам использовать строку, которая является моим личным предпочтением для этих кодов, и если вы выберете число, вам придется удалить 0 чтобы оно работало.

Ответ 2

Одна из наиболее запутанных частей JavaScript заключается в том, что если число начинается с 0, за которым сразу следует ., он представляет восьмеричную, а не десятичную.

JSON берет из синтаксиса JavaScript, но избегает запутывающих функций, поэтому просто запрещает числа с ведущими нулями (если только после этого не следует .).

Даже если это не так, не было бы причин ожидать, что 0 все еще будет в числе, когда он был проанализирован, поскольку 02 и 2 являются просто разностными представлениями того же числа ( если вы заставляете десятичный знак).

Если начальный ноль важен для ваших данных, то у вас, вероятно, есть строка, а не число.

"UPC":"083456789012"

A код продукта - это идентификатор, а не то, что вы делаете с математикой. Это должна быть строка.

Ответ 3

Формально это связано с тем, что 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

Ответ 4

UPC должен быть в строчном формате. В будущем вы также можете получить и другие типы UPC, такие как GS128 или коды идентификации продуктов на основе строк. Установите столбец базы данных в строку.

Ответ 5

Если целое число начинается с 0 в JavaScript, оно считается значением Octal (base 8) целого числа вместо десятичного (базового 10) значения. Например:

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

Ответ 6

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