que - lista de datos en json
¿Puedes usar una coma al final en un objeto JSON? (14)
Cuando se genera manualmente un objeto o matriz JSON, a menudo es más fácil dejar una coma al final del último elemento en el objeto o matriz. Por ejemplo, el código para generar una serie de cadenas puede parecer (en un pseudocódigo de C ++):
s.append("[");
for (i = 0; i < 5; ++i) {
s.appendF("/"%d/",", i);
}
s.append("]");
dandote una cuerda como
[0,1,2,3,4,5,]
¿Está esto permitido?
A partir de mi experiencia pasada, descubrí que los distintos navegadores manejan las comas finales en JSON de manera diferente.
Tanto Firefox como Chrome lo manejan bien. Pero el IE (todas las versiones) parece romperse. Quiero decir realmente romper y dejar de leer el resto del guión.
Teniendo eso en cuenta, y también en el hecho de que siempre es bueno escribir un código compatible, sugiero realizar un esfuerzo extra para asegurarse de que no haya una coma al final.
:)
Como ya se ha dicho, la especificación JSON (basada en ECMAScript 3) no permite una coma final. ES> = 5 lo permite, por lo que puede usar esa notación en JS puro. Se ha discutido y algunos analizadores lo han apoyado ( http://bolinfest.com/essays/json.html , Firefox ), pero es un hecho específico (como se muestra en http://json.org/ ) que no debería funcionar en JSON. Esa cosa dijo ...
... Me pregunto por qué nadie señaló que realmente puede dividir el bucle en la iteración 0 y usar una coma al principio en lugar de arrastrar uno para deshacerse del olor del código de comparación y cualquier sobrecarga de rendimiento real en el bucle, lo que da como resultado un código que en realidad es más corto, más simple y más rápido (debido a que no hay ramificaciones / condicionales en el bucle) que otras soluciones propuestas.
Por ejemplo (en un pseudocódigo de estilo C similar al código propuesto por OP):
s.append("[");
// MAX == 5 here. if it''s constant, you can inline it below and get rid of the comparison
if ( MAX > 0 ) {
s.appendF("/"%d/"", 0); // 0-th iteration
for( int i = 1; i < MAX; ++i ) {
s.appendF(",/"%d/"", i); // i-th iteration
}
}
s.append("]");
Con Relaxed JSON, puede tener comas al final, o simplemente dejar las comas fuera . Son opcionales.
No hay ninguna razón para que las comas estén presentes para analizar un documento similar a JSON.
Eche un vistazo a la especificación JSON relajada y verá cuán "ruidosa" es la especificación JSON original. Demasiadas comas y comillas ...
También puede probar su ejemplo utilizando este analizador RJSON en línea y ver cómo se analiza correctamente.
http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D
Curiosamente, tanto C como C ++ (y creo que C #, pero no estoy seguro) permiten específicamente la coma al final, exactamente por el motivo: esto hace que la generación de listas mediante programación sea mucho más fácil. No estoy seguro de por qué JavaScript no siguió su ejemplo.
De acuerdo con la especificación de clase JSONArray :
- Un extra, (coma) puede aparecer justo antes del corchete de cierre.
- El valor nulo se insertará cuando haya, (coma) elision.
Entonces, como lo entiendo, debería permitirse escribir:
[0,1,2,3,4,5,]
Pero podría suceder que algunos analizadores devuelvan el 7 como recuento de elementos (como IE8 como señaló Daniel Earwicker) en lugar del 6 esperado.
Editado:
Encontré este validador JSON que valida una cadena JSON contra RFC 4627 (el tipo de medio aplicación / json para la notación de objetos de JavaScript) y contra la especificación del lenguaje JavaScript. En realidad, aquí una matriz con una coma final se considera válida solo para JavaScript y no para la especificación RFC 4627.
Sin embargo, en la especificación RFC 4627 se afirma que:
2.3. Arrays
Una estructura de matriz se representa como corchetes que rodean cero o más valores (o elementos). Los elementos están separados por comas.
array = begin-array [ value *( value-separator value ) ] end-array
Para mí esto es nuevamente un problema de interpretación. Si escribe que los elementos están separados por comas (sin indicar algo sobre casos especiales, como el último elemento), se podría entender de ambas maneras.
PS RFC 4627 no es un estándar (como se indica explícitamente), y ya está obsoleto por RFC 7159 (que es un estándar propuesto) RFC 7159
Desafortunadamente, la especificación JSON no permite una coma al final. Hay algunos navegadores que lo permitirán, pero generalmente debe preocuparse por todos los navegadores.
En general, intento cambiar el problema y agregar la coma antes del valor real, por lo que terminas con un código que se ve así:
s.append("[");
for (i = 0; i < 5; ++i) {
if (i) s.append(","); // add the comma only if this isn''t the first entry
s.appendF("/"%d/"", i);
}
s.append("]");
Ese extra de una línea de código en tu bucle for no es caro ...
Otra alternativa que he usado al generar una estructura en JSON desde un diccionario de alguna forma es agregar siempre una coma después de cada entrada (como lo está haciendo arriba) y luego agregar una entrada ficticia al final que no tenga una coma final (pero eso es simplemente perezoso; ->).
Desafortunadamente, no funciona bien con una matriz.
Las comas finales están permitidas en JavaScript, pero no funcionan en IE. La especificación JSON sin versión de Douglas Crockford no lo permitía, y como no tenía versión, no se suponía que esto cambiara. La especificación JSON de ES5 les permitió una extensión, pero el RFC 4627 de Crockford no, y ES5 volvió a deshabilitarlos. Firefox siguió su ejemplo. Internet Explorer es la razón por la que no podemos tener cosas buenas.
Los codificadores de PHP pueden querer revisar implode () . Esto toma una matriz que se une utilizando una cadena.
De los docs ...
$array = array(''lastname'', ''email'', ''phone'');
echo implode(",", $array); // lastname,email,phone
Mantengo un recuento actual y lo comparo con un recuento total. Si el recuento actual es menor que el recuento total, muestro la coma.
Puede que no funcione si no tiene un recuento total antes de ejecutar la generación JSON.
Nuevamente, si usa PHP 5.2.0 o superior, puede simplemente formatear su respuesta usando la API JSON incorporada.
No se recomienda, pero aún puedes hacer algo como esto para analizarlo.
jsonStr = ''[0,1,2,3,4,5,]'';
let data;
eval(''data = '' + jsonStr);
console.log(data)
No. La especificación JSON, como se mantiene en http://json.org/ , no permite comas finales. Por lo que he visto, algunos analizadores pueden permitirlos silenciosamente al leer una cadena JSON, mientras que otros arrojan errores. Para la interoperabilidad, no debes incluirlo.
El código anterior se podría reestructurar, ya sea para eliminar la coma final al agregar el terminador de la matriz o para agregar la coma antes de los elementos, omitiendo eso para el primero.
Por lo general, recorro la matriz y adjunto una coma después de cada entrada en la cadena. Después del bucle borro la última coma de nuevo.
Tal vez no sea la mejor, pero menos costoso que comprobar cada vez que es el último objeto del circuito, supongo.
Simple, barato, fácil de leer, y siempre funciona sin importar las especificaciones.
$delimiter = '''';
for .... {
print $delimiter.$whatever
$delimiter = '','';
}
La asignación redundante a $ delim es un precio muy pequeño a pagar. También funciona igual de bien si no hay un bucle explícito sino fragmentos de código separados.
Utilice JSON5. No uses JSON.
- Los objetos y matrices pueden tener comas de cola
- Las claves de los objetos no pueden estar entre comillas si son identificadores válidos
- Las cadenas pueden ser entre comillas simples
- Las cadenas se pueden dividir en varias líneas
- Los números pueden ser hexadecimales (base 16)
- Los números pueden comenzar o terminar con un punto decimal (inicial o final).
- Los números pueden incluir Infinito e Infinito.
- Los números pueden comenzar con un signo más (+) explícito.
- Se permiten comentarios tanto en línea (línea única) como en bloque (línea múltiple).