¿Puedes usar una coma final en un objeto JSON?

Resuelto Ben Combee asked hace 15 años • 21 respuestas

Al generar manualmente un objeto o matriz JSON, suele ser más fácil dejar una coma al final del último elemento del objeto o matriz. Por ejemplo, el código que se genera a partir de una matriz de cadenas podría verse así (en un pseudocódigo similar a C++):

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

dándote una cuerda como

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

¿Está esto permitido?

Ben Combee avatar Oct 14 '08 23:10 Ben Combee
Aceptado

Lamentablemente, la especificación JSON no permite una coma al final. Hay algunos navegadores que lo permiten, pero en general debes preocuparte por todos los navegadores.

En general, intento solucionar el problema y agregar la coma antes del valor real, para terminar con un código similar a este:

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 usado al enviar una estructura a JSON desde un diccionario de algún tipo 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 al final (pero eso es simplemente vago ;->).

Desafortunadamente, no funciona bien con una matriz.

brianb avatar Oct 14 '2008 16:10 brianb

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 permitirlos silenciosamente al leer una cadena JSON, mientras que otros arrojarán errores. Para la interoperabilidad, no deberías incluirlo.

El código anterior podría reestructurarse, 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.

Ben Combee avatar Oct 14 '2008 16:10 Ben Combee

Sencillo, económico, 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.

Overflowee avatar Dec 16 '2011 07:12 Overflowee