Illegal unquoted character ((CTRL-CHAR, code 10))
Uma string do documento contém um caractere de controle literal. O código 10 é uma quebra de linha, o 13 um retorno de carro, o 9 uma tabulação. O JSON exige que sejam escapados, e o Jackson faz bem em rejeitá-los. É o mesmo problema de fundo que o V8 chama de "bad control character".
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 embutido em uma string
SQL, stack traces, linhas de log e conteúdo de template carregam quebras de linha reais.
Quebra
{ "query": "SELECT * FROM users" }Funciona
{ "query": "SELECT *\nFROM users" } -
02 JSON montado por concatenação
Valores interpolados não são escapados. Serialize com ObjectMapper.writeValueAsString em vez de montar o texto à mão.
Quebra
String body = "{\"note\": \"" + note + "\"}";Funciona
String body = mapper.writeValueAsString(Map.of("note", note)); -
03 Fins de linha do Windows dentro de um valor
O retorno de carro, código 13, é um caractere de controle à parte e precisa de \r.
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) |
|---|---|
| Python | Invalid control character at: line 1 column 8 (char 7) |
Perguntas frequentes
- E o ALLOW_UNESCAPED_CONTROL_CHARS?
- JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS faz o Jackson aceitá-los, e é um paliativo razoável quando você não consegue mudar quem produz. Isso não torna o documento JSON válido, então qualquer outra coisa que o consuma vai continuar falhando.
Conserte agora
Cole o payload na ferramenta acima, ou vá direto para a que foi feita para este trabalho.
Escapar o valor