¿Se puede usar una coma final en un objeto JSON?


Cuando se genera manualmente un objeto o matriz JSON, a menudo es más fácil dejar una coma final en el último elemento del objeto o matriz. Por ejemplo, el código de salida de una matriz de cadenas podría verse como (en un C++ como pseudocódigo):

s.append("[");
for (i = 0; i < 5; ++i) {
    s.appendF("\"%d\",", i);
}
s.append("]");

Dándole una cadena como

[0,1,2,3,4,5,]

¿Está permitido?

Author: pkamb, 2008-10-14

14 answers

Desafortunadamente la especificación JSON no permite una coma final. Hay algunos navegadores que lo permitirán, pero generalmente debe preocuparse por todos los navegadores.

En general trato de dar la vuelta al problema, y añadir la coma antes del valor real, por lo que termina con el código que se parece a esto:

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("]");

Esa línea adicional de código en su bucle for no es costosa...

Otra alternativa que he utilizado cuando la salida de una estructura a JSON de un el diccionario de alguna forma es siempre agregar una coma después de cada entrada (como lo está haciendo anteriormente) y luego agregar una entrada ficticia al final que no tenga una coma final (pero eso es simplemente perezoso; ->).

No funciona bien con una matriz desafortunadamente.

 190
Author: brianb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-03 21:31:43

No. La especificación JSON, tal como se mantiene en http://json.org , no permite comas finales. Por lo que he visto, algunos analizadores pueden permitir silenciosamente al leer una cadena JSON, mientras que otros arrojarán errores. Para la interoperabilidad, no debería incluirla.

El código anterior podría ser reestructurado, ya sea para eliminar la coma final al agregar el terminador de matriz o para agregar la coma antes de los elementos, omitiendo eso para el primero.

 115
Author: Ben Combee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-16 01:12:50

Simple, barato, fácil de leer y siempre funciona independientemente de 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.

 96
Author: Overflowee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-05 19:08:05

Las comas finales están permitidas en JavaScript, pero no funcionan en IE. La especificación JSON sin versión de Douglas Crockford no los permitía, y debido a que era sin versión, esto no debía cambiar. La especificación JSON de ES5 los permitió como una extensión, pero el RFC 4627 de Crockford no lo hizo, y ES5 volvió a desautorizarlos. Firefox hizo lo mismo. Internet Explorer es la razón por la que no podemos tener cosas bonitas.

 17
Author: Tobu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-15 20:18:18

Los programadores de PHP pueden querer revisar implode(). Esto toma un array lo une usando una cadena.

De los documentos...

$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone
 11
Author: Rik Heywood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-13 16:49:06

Como ya se ha dicho, la especificación JSON (basada en ECMAScript 3) no permite la coma final. ES > = 5 lo permite, así que puedes usar esa notación en JS puro. Se ha discutido sobre esto, y algunos analizadores lo apoyaron ( http://bolinfest.com/essays/json.html, http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-no-longer-accepted/), pero es el hecho de la especificación (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 en realidad se puede dividir el bucle en 0th iteración y usar coma inicial en lugar de ir detrás de uno para deshacerse del olor del código de comparación y cualquier sobrecarga de rendimiento real en el bucle, lo que resulta en un código que es en realidad más corto, más simple y más rápido (debido a la ausencia de ramificación/condicionales en el bucle) que otras soluciones propuestas.

Por ejemplo (en un pseudocódigo de estilo C similar al propuesto por OP código):

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("]");
 9
Author: vaxquis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-23 21:41:39

Curiosamente, tanto C como C++ (y creo que C#, pero no estoy seguro) permiten específicamente la coma final exactly exactamente por la razón dada: Hace que la generación de listas programáticamente sea mucho más fácil. No estoy seguro de por qué JavaScript no siguió su ejemplo.

 6
Author: James Curran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-14 17:29:36

Utilice JSON5. No uses JSON.

  • Los objetos y matrices pueden tener comas finales
  • Las claves de objeto pueden no entrecomillarse si son identificadores válidos
  • Las cadenas pueden ser 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 plus explícito (+) firmar.
  • Los comentarios en línea (de una sola línea) y en bloque (de varias líneas) están permitidos.

Http://json5.org/

Https://github.com/aseemk/json5

 5
Author: user619271,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-24 07:35:55

De mi experiencia pasada, encontré que los diferentes navegadores tratan con las comas finales en JSON de manera diferente.

Tanto Firefox como Chrome lo manejan bien. Pero IE (Todas las versiones) parece romperse. Quiero decir realmente romper y dejar de leer el resto del guión.

Teniendo esto en cuenta, y también el hecho de que siempre es bueno escribir código compatible, sugiero gastar el esfuerzo adicional de asegurarse de que no haya una coma final.

:)

 1
Author: dnshio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-14 15:59:24

Mantengo un conteo actual y lo comparo con un conteo total. Si el conteo actual es menor que el conteo total, muestro la coma.

Puede no funcionar si no tiene un recuento total antes de ejecutar la generación JSON.

Por otra parte, si está utilizando PHP 5.2.0 o superior, solo puede formatear su respuesta utilizando la API JSON incorporada.

 1
Author: eddie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-11 11:29:16

De acuerdo con la especificación JSONArray de la clase :

  • Un extra , (coma) puede aparecer justo antes del corchete de cierre.
  • El valor null se insertará cuando haya , (coma) elisión.

Así que, según lo entiendo, se debería permitir 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 esperado 6.


Editado:

Encontré este Validador JSON que valida una cadena JSON contra RFC 4627 (El tipo de medio application/json para la Notación de Objetos 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 indica que:

2.3. Matrices

Una estructura de matriz se representa como corchetes cuadrados alrededor de 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 de nuevo un problema de interpretación. Si escribes que los elementos están separados por comas (sin indicar algo sobre casos especiales, como el último elemento), podría entenderse de ambas maneras.

P.d. 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

 1
Author: Timoty Weis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-29 06:09:21

Normalmente hago un bucle sobre el array 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 manera, pero menos costoso que comprobar cada vez si es el último objeto en el bucle, supongo.

 0
Author: Nils,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-11 10:06:49

No se recomienda, pero aún puede hacer algo como esto para analizarlo.

jsonStr = '[0,1,2,3,4,5,]';
let data;
eval('data = ' + jsonStr);
console.log(data)
 0
Author: feibing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-01 21:35:40

Con JSON relajado, puede tener comas finales, 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 relajada especificación JSON y verá lo 'ruidosa' que es la especificación JSON original. Demasiadas comas y comillas...

Http://www.relaxedjson.org

También puede probar su ejemplo usando 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

 0
Author: Steven Spungin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-08 15:58:59