Errores de JSON, explicados
Cada página de aquí toma un mensaje de error exacto y responde a tres preguntas: de qué se quejaba realmente el parser, qué lo causa en código real ordenado por frecuencia, y qué cambiar. Cada una incrusta el validador, así que puedes arreglar tu payload sin salir de la página.
Los mensajes están medidos, no recordados. Toda cadena de V8 y de Python de este sitio salió de ejecutar el parser. Las cadenas de Firefox y Safari están ausentes a propósito, porque no pudimos ejecutarlas y verificarlas, y publicar una suposición sobre un mensaje de error en un sitio cuyo argumento entero es la corrección sería un mal negocio.
O simplemente pega el payload
Nada de lo que pegues sale de tu navegador. La lista de permitidos de connect-src convierte eso en una garantía del navegador, no en una promesa. Compruébalo tú mismo
JavaScript, Node y Chrome
Medido en Node v24.15.0 con V8 13.6.233.17. V8 reescribió casi todos estos mensajes en 2022, así que cada página lleva tanto la redacción actual como la que encontrarás en respuestas antiguas.
-
Unexpected token '<', "<!DOCTYPE "... is not valid JSONEl servidor devolvió una página de error , y 4 causas más. -
Unexpected end of JSON inputLa cadena está vacía , y 4 causas más. -
"[object Object]" is not valid JSONEl valor ya estaba parseado , y 2 causas más. -
"undefined" is not valid JSONUna clave de almacenamiento que nunca se estableció , y 2 causas más. -
Unexpected non-whitespace character after JSON at position N (line L column C)La entrada es NDJSON o JSON Lines , y 3 causas más. -
Bad control character in string literal in JSON at position N (line L column C)Texto multilínea pegado directamente dentro de una cadena , y 3 causas más. -
Bad escaped character in JSON at position N (line L column C)Una ruta de archivo de Windows con barras invertidas simples , y 3 causas más. -
Expected double-quoted property name in JSON at position N (line L column C)Una coma final antes de la llave de cierre , y 2 causas más. -
Expected property name or '}' in JSON at position N (line L column C)Claves con comillas simples, de un dict de Python impreso con str() , y 3 causas más. -
Expected ',' or '}' after property value in JSON at position N (line L column C)Falta una coma entre propiedades , y 3 causas más. -
Unterminated string in JSON at position N (line L column C)Una comilla doble sin escapar dentro del valor , y 3 causas más.
Python
Medido en CPython 3.14.3. Dos de estos mensajes son nuevos en Python 3.13, así que la versión importa y cada página dice cuál.
-
Expecting value: line 1 column 1 (char 0)El cuerpo de la respuesta es HTML, no JSON , y 3 causas más. -
Extra data: line L column C (char N)El archivo es JSON Lines , y 2 causas más. -
Expecting ',' delimiter: line L column C (char N)Una comilla doble sin escapar dentro de una cadena , y 3 causas más. -
Expecting property name enclosed in double quotes: line L column C (char N)Un dict de Python impreso en vez de serializado , y 2 causas más. -
Invalid control character at: line L column C (char N)Texto multilínea dentro de una cadena , y 2 causas más. -
Invalid \escape: line L column C (char N)Una ruta de Windows , y 2 causas más. -
Unterminated string starting at: line L column C (char N)Una comilla sin escapar dentro del valor , y 2 causas más.
PHP
PHP falla en silencio por defecto, que es el verdadero problema. La página cubre cómo sacarle un mensaje de verdad.
C# y .NET
Newtonsoft.Json y System.Text.Json redactan el mismo fallo de forma distinta.
Java
Jackson, que es lo que casi todo el ecosistema JVM usa por debajo.
Los cuatro fallos detrás de casi todos estos
Quita la redacción y casi todos los mensajes de esta página vienen de una de cuatro cosas.
- No es JSON en absoluto
- Una página de error HTML, un cuerpo vacío, un mensaje de texto plano. El parser tiene razón y la petición está mal. Comprueba el código de estado y el Content-Type antes que el cuerpo.
- Es JavaScript o Python, no JSON
- Comillas simples, claves sin comillas, comas finales, True y None. Casi siempre un dict o un literal de objeto que se imprimió en vez de serializarse. Reparar lo arregla todo.
- Una cadena se construyó por concatenación
- Lo que significa que los valores nunca se escaparon, así que una comilla o un salto de línea dentro de uno rompe el documento. Serializar en su lugar hace imposible esta clase de bug.
- Son varios documentos, no uno
- NDJSON leído como un solo valor. Léelo línea a línea o envuelve los registros en un array.