Por qué una coma final rompe JSON
En resumen: Las comas finales son legales en los literales de objeto de JavaScript y fatales en JSON. Aquí tienes el error exacto, la gramática de RFC 8259 que lo provoca y tres correcciones que realmente funcionan.

En resumen: JSON prohíbe las comas finales en todas partes —cuando un analizador falla, elimina la última coma con un formateador; usa JSON5 o JSONC solo para análisis tolerante local, y emite siempre JSON estándar a otros sistemas.
Porque la gramática lo dice.
{
"name": "demo",
"size": 12,
}
JSON.parse lanza Unexpected token } in JSON at position 34. Node lo formula de otra manera, pero todos los motores apuntan al mismo sitio: la coma antes de }.
Qué está reclamando en realidad el analizador
La producción de objeto en RFC 8259 es:
object = begin-object [ member *( value-separator member ) ] end-object
Los corchetes significan opcional; el asterisco significa cero o más. En términos llanos: las comas separan miembros, y al último miembro le sigue directamente }.
Por tanto, después de una coma el analizador está listo para otro nombre de miembro. Lee } y falla. Los arrays se comportan igual: [1, 2, 3,] falla en el ].
De dónde viene la costumbre
Los literales de objeto de JavaScript permiten comas finales desde ES5, igual que las listas de Python y los literales compuestos de Go. Los editores las añaden automáticamente. Luego alguien copia un literal de objeto de un archivo .js a un archivo .json y el archivo deja de analizarse.
La otra fuente habitual es el JSON construido a mano: un bucle que recorre i <= length deja una coma después del último elemento.
Tres correcciones
Elimina la coma. Vale para ediciones manuales. Pégalo en el formateador de JSON y el error se informa con línea y columna, así que ves exactamente cuál hay que borrar.
Analiza como JSON5. Los superconjuntos aceptan comas finales, lo que va bien para configuración local. No va bien para nada que envíes a otro sistema: el receptor seguirá rechazándolo.
Deja de concatenar cadenas. Usa JSON.stringify, json.dumps, Jackson. El serializador gestiona los separadores correctamente y resuelve el escape al mismo tiempo.
Lista de comprobación rápida
| Dónde | Causa típica |
|---|---|
| Concatenación en bucle | i <= length deja una coma de más |
| Copiar y pegar | Literal de objeto sacado de un archivo JS |
| Plantillas | Coma escrita a mano más un bucle que añade otra |
| Edición manual | Se borró el último campo y su coma quedó atrás |
FAQ
¿Por qué las comas finales son legales en JavaScript pero no en JSON?
Los literales de objeto de JavaScript las permiten desde ES5, igual que las listas de Python y los literales compuestos de Go, y por eso la costumbre acompaña a la gente cuando llega a JSON. RFC 8259 solo permite comas entre miembros: al último miembro le sigue directamente } o ]. Copiar un literal de objeto de un archivo .js a un archivo .json es la fuente habitual.
¿Debería analizar como JSON5 para aceptar comas finales?
Solo para configuración local. Los superconjuntos aceptan comas finales, pero todo lo que envíes a otro sistema se analiza como JSON estricto y seguirá fallando. Genera JSON estándar en la frontera de salida en lugar de confiar en que el receptor sea indulgente.
¿Dónde debería mirar primero tras un error de coma final?
Empieza por la posición del mensaje de error: normalmente apunta a la coma antes de } o ]. Después revisa las tres fuentes habituales: un bucle escrito con i <= length, un literal de objeto pegado desde un archivo JS y una plantilla que fija una coma escrita a mano junto a un bucle. Pegarlo en un formateador informa de la línea y columna exactas.