Bad control character in string literal in JSON at position N (line L column C)
Uma string do seu documento contém um caractere de controle literal: quase sempre uma quebra de linha de verdade, às vezes uma tabulação. Strings JSON não podem conter caracteres abaixo de U+0020 sem escape. Uma quebra de linha tem que ser escrita como \n, e uma tabulação como \t. A posição aponta para o caractere problemático.
Cole o seu JSON e veja exatamente onde ele quebra
Nada do que você cola sai do seu navegador. A lista de permissões connect-src transforma isso em uma garantia do navegador, e não em uma promessa. Confira você mesmo
O que realmente causa isso
Ordenados por quantas vezes cada um acaba sendo a resposta.
-
01 Texto de várias linhas colado direto dentro de uma string
SQL, HTML, um trecho de log ou uma mensagem de erro com quebras de linha reais dentro. Para o parser, a quebra de linha encerra a string.
Quebra
{ "query": "SELECT * FROM users" }Funciona
{ "query": "SELECT *\nFROM users" } -
02 JSON montado por concatenação de strings
Esta é a causa raiz de quase todos os casos. JSON montado à mão não escapa os valores que você interpola nele. Serialize o objeto em vez disso e o problema não tem como acontecer.
Quebra
const body = '{"note": "' + note + '"}';Funciona
const body = JSON.stringify({ note }); -
03 Uma tabulação que veio junto no copiar e colar
Tabulações são invisíveis e caem dentro de strings com facilidade quando se copia de uma planilha ou de um terminal. Escape como \t, ou remova antes de montar o documento.
-
04 Fins de linha do Windows dentro de um valor
Um retorno de carro, U+000D, também é caractere de controle. Texto lido de um arquivo do Windows e embutido em uma string carrega \r além de \n.
O mesmo erro em outros runtimes
O problema de fundo é idêntico; só muda a redação. Se um colega reportar uma dessas mensagens, ele está olhando exatamente para a mesma coisa que você.
| 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 |
Perguntas frequentes
- Quais caracteres precisam de escape?
- Tudo de U+0000 até U+001F, mais as aspas duplas e a barra invertida. O JSON define escapes curtos para backspace, form feed, quebra de linha, retorno de carro e tabulação; qualquer outro nessa faixa precisa da forma \u, por exemplo \u0000.
- Dá para fazer o parser aceitar esses caracteres?
- O Jackson tem ALLOW_UNESCAPED_CONTROL_CHARS e alguns parsers têm chaves parecidas, mas isso esconde o problema em vez de resolver, e o documento continua inválido para todo outro consumidor. Escape no ponto em que o JSON é produzido.
Conserte agora
Cole o payload na ferramenta acima, ou vá direto para a que foi feita para este trabalho.
Reparar automaticamente