comando - ¿Por qué JSON no es válido si un entero comienza con un cero a la izquierda?
tellraw generator 1.12 1 (6)
Creo que la forma más fácil de enviar su número por JSON es enviar su número como una cadena.
Estoy importando algunos archivos JSON en mi proyecto Parse.com, y sigo recibiendo el error "clave no válida: par de valores".
Establece que hay un inesperado "8".
Aquí hay un ejemplo de mi JSON:
}
"Manufacturer":"Manufacturer",
"Model":"THIS IS A STRING",
"Description":"",
"ItemNumber":"Number12345",
"UPC":083456789012,
"Cost":"$0.00",
"DealerPrice":" $0.00 ",
"MSRP":" $0.00 ",
}
Si actualizo el JSON eliminando el
0
de
"UPC":083456789012,
o convirtiéndolo en
"UPC":"083456789012",
se vuelve válido.
¿Puede JSON realmente no aceptar un número entero que comienza con
0
, o hay alguna forma de evitar el problema?
El UPC debe estar en formato de cadena. En el futuro, también puede obtener otro tipo de UPC, como GS128 o códigos de identificación de productos basados en cadenas. Establezca su columna DB para ser una cadena.
Formalmente, es porque JSON usa
DecimalIntegerLiteral
en su producción
JSONNumber
:
JSONNumber ::
-_opt DecimalIntegerLiteral JSONFraction_opt ExponentPart_opt
Y
DecimalIntegerLiteral
solo puede comenzar con
0
si es
0
:
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits_opt
La razón detrás de esto es probablemente:
- En la gramática JSON: para reutilizar construcciones de la gramática principal ECMAScript.
-
En la gramática principal de ECMAScript, para que sea más fácil distinguir
DecimalIntegerLiteral
deHexIntegerLiteral
yOctalIntegerLiteral
.OctalIntegerLiteral
en primer lugar.
Ver estas producciones:
HexIntegerLiteral ::
0x HexDigit
0X HexDigit
HexIntegerLiteral HexDigit
...
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
Si un entero comienza con
0
en JavaScript, se considera que es el valor Octal (base 8) del entero en lugar del valor decimal (base 10).
Por ejemplo:
var a = 065; //Octal Value
var b = 53; //Decimal Value
a == b; //true
Un 0 inicial indica un número octal en JavaScript. Un número octal no puede contener un 8; por lo tanto, ese número no es válido Además, JSON no admite (oficialmente) números octales, por lo que formalmente el JSON no es válido, incluso si el número no contiene un 8. Sin embargo, algunos analizadores sí lo admiten, lo que puede generar cierta confusión. Otros analizadores lo reconocerán como una secuencia no válida y arrojarán un error, aunque la explicación exacta que brinden puede diferir.
Solución: si tiene un número, no lo guarde nunca con ceros a la izquierda. Si tiene un valor que necesita tener un cero inicial, no lo trate como un número, sino como una cadena. Almacénelo con citas a su alrededor.
En este caso, tiene un UPC que debe tener 12 dígitos y puede contener ceros a la izquierda. Creo que la mejor manera de almacenarlo es como una cadena.
Sin embargo, es discutible. Si lo trata como un código de barras, viendo el 0 inicial como parte integral de él, entonces la cadena tiene sentido. Otros tipos de códigos de barras pueden incluso contener caracteres alfabéticos.
Por otra parte.
Un UPC es un número, y el hecho de que esté relleno con ceros a 12 dígitos podría verse como una propiedad de visualización.
En realidad, si lo rellena a la izquierda con 13 dígitos agregando un 0 adicional, tiene un código EAN, porque EAN es un superconjunto de UPC.
Si tiene un monto monetario, puede mostrarlo como
€ 7.30
, mientras lo almacena como
7.3
, por lo que también podría tener sentido almacenar un código de producto como un número.
Pero esa decisión depende de usted.
Solo puedo aconsejarle que use una cadena, que es mi preferencia personal para estos códigos, y si elige un número, tendrá que eliminar el
0
para que funcione.
Una de las partes más confusas de JavaScript es que si un número comienza con un
0
que no es seguido inmediatamente por un
.
, representa un octal, no un decimal.
JSON toma prestado de la sintaxis de JavaScript, pero evita características confusas, por lo que simplemente prohíbe los números con ceros a la izquierda (a menos que luego estén seguidos de a).
Incluso si este no fuera el caso, no habría razón para esperar que el
0
todavía esté en el número cuando se analizó ya que
02
y
2
son solo representaciones de diferencia del mismo número (si fuerza el decimal).
Si el cero inicial es importante para sus datos, entonces probablemente tenga una cadena y no un número.
"UPC":"083456789012"
Un código de producto es un identificador, no algo con lo que se hace matemática. Debería ser una cuerda.