Bad control character in string literal in JSON at position N (line L column C)
Una cadena de tu documento contiene un carácter de control literal: casi siempre un salto de línea real, a veces un tabulador. Las cadenas JSON no pueden contener caracteres por debajo de U+0020 sin escapar. Un salto de línea hay que escribirlo como \n, y un tabulador como \t. La posición apunta al carácter problemático.
Pega tu JSON y ve exactamente dónde se rompe
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
Qué lo provoca realmente
Ordenados por la frecuencia con la que cada uno acaba siendo la respuesta.
-
01 Texto multilínea pegado directamente dentro de una cadena
SQL, HTML, un extracto de log o un mensaje de error con saltos de línea reales dentro. Para el parser, el salto de línea termina la cadena.
Falla
{ "query": "SELECT * FROM users" }Funciona
{ "query": "SELECT *\nFROM users" } -
02 JSON construido concatenando cadenas
Esta es la causa raíz de casi todos los casos. El JSON ensamblado a mano no escapa los valores que interpolas dentro. Serializa el objeto en su lugar y el problema no puede ocurrir.
Falla
const body = '{"note": "' + note + '"}';Funciona
const body = JSON.stringify({ note }); -
03 Un tabulador que llegó con un copiar y pegar
Los tabuladores son invisibles y aterrizan en las cadenas con facilidad al copiar desde una hoja de cálculo o un terminal. Escápalos como \t, o elimínalos antes de construir el documento.
-
04 Finales de línea de Windows dentro de un valor
Un retorno de carro, U+000D, también es un carácter de control. El texto leído de un archivo de Windows e incrustado en una cadena arrastra \r además de \n.
El mismo error en otros entornos
El problema de fondo es idéntico; solo cambia la redacción. Si un compañero reporta alguno de estos, está mirando exactamente lo mismo que tú.
| Python | Invalid control character at: line 1 column 8 (char 7) |
|---|---|
| Java (Jackson) | Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value |
Preguntas frecuentes
- ¿Qué caracteres hay que escapar?
- Todo lo que va de U+0000 a U+001F, más la comilla doble y la barra invertida. JSON define escapes cortos para retroceso, salto de página, salto de línea, retorno de carro y tabulador; cualquier otro de ese rango necesita la forma \u, por ejemplo \u0000.
- ¿Puedo hacer que el parser los acepte?
- Jackson tiene ALLOW_UNESCAPED_CONTROL_CHARS y algunos parsers tienen interruptores parecidos, pero eso esconde el problema en vez de arreglarlo, y el documento sigue siendo inválido para cualquier otro consumidor. Escapa en el punto donde se produce el JSON.
Arréglalo ahora
Pega el payload en la herramienta de arriba, o ve directamente a la creada para este trabajo.
Repararlo automáticamente