Invalid control character at: line L column C (char N)
Uma string contém um caractere literal abaixo de U+0020, normalmente uma quebra de linha ou tabulação de verdade. O JSON exige que sejam escapados. O Python tem a opção strict=False que os aceita, mas o documento resultante continua inválido para todo outro consumidor.
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 dentro de uma string
Trechos de log, SQL, stack traces e HTML de template carregam quebras de linha reais.
Quebra
json.loads('{"sql": "SELECT * FROM t"}')Funciona
json.loads('{"sql": "SELECT *\\nFROM t"}') -
02 JSON montado com f-strings ou concatenação
Valores interpolados não são escapados. Monte um dict e use json.dumps, que escapa tudo corretamente.
Quebra
body = f'{{"note": "{note}"}}'Funciona
body = json.dumps({"note": note}) -
03 Uma tabulação copiada de uma planilha
Invisível, e sobrevive intacta ao copiar e colar.
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ê.
| JavaScript (V8) | Bad control character in string literal in JSON at position 11 (line 1 column 12) |
|---|
Perguntas frequentes
- O que o strict=False faz?
- json.loads(s, strict=False) permite caracteres de controle dentro das strings. Desatola você, mas o documento continua sendo JSON inválido, então qualquer coisa mais adiante que não seja Python vai continuar rejeitando. Conserte quem produz, em vez disso.
Conserte agora
Cole o payload na ferramenta acima, ou vá direto para a que foi feita para este trabalho.
Escapar a string direito