JsonParseException: caractere ilegal sem aspas ((CTRL-CHAR, código 10)

93

Estou tentando usar org.apache.httpcomponentspara consumir uma API Rest, que postará dados no formato JSON na API.

Eu recebo esta exceção:

Causado por: com.fasterxml.jackson.core.JsonParseException: Caractere ilegal não cotado ((CTRL-CHAR, código 10)): deve ser escapado usando barra invertida para ser incluído na string.

O motivo é porque ctrl-charestá incluído na string JSON.

Existe alguma maneira de substituir esta ou alguma outra solução?

jian zhong
fonte
1
Você está criando o JSON sozinho? Basicamente, parece que você tem dados corrompidos ... então conserte se puder ou reclame com quem os está produzindo.
Jon Skeet
1
Conforme discutido nesta resposta StackOverflow , seu JSON é validado corretamente por meio de jsonlint.com ?
Eric McCormick
A ideia do Intellij o valida assim que você abre o arquivo .json. Tente!
Gaurav

Respostas:

83

Isso pode acontecer se você tiver uma nova linha (ou outro caractere de controle) em um literal de string JSON.

{"foo": "bar
baz"}

Se for você quem está produzindo os dados, substitua as novas linhas reais por aquelas com escape "\\n"ao criar seus literais de string.

{"foo": "bar\nbaz"}
pyrospade
fonte
55

Usando

mapper.configure(
    JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), 
    true
);

Veja javadoc :

/**
 * Feature that determines whether parser will allow
 * JSON Strings to contain unescaped control characters
 * (ASCII characters with value less than 32, including
 * tab and line feed characters) or not.
 * If feature is set false, an exception is thrown if such a
 * character is encountered.
 *<p>
 * Since JSON specification requires quoting for all control characters,
 * this is a non-standard feature, and as such disabled by default.
 */

A opção antiga JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARSfoi descontinuada desde 2.10.

Consulte também o tópico do github .

Hoang
fonte
como implementar isso em xml? Eu tenho <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="serializationInclusion" value="NON_NULL"/> </bean> </property> <property name="supportedMediaTypes" value="application/json"/> </bean> </mvc:message-converters> </mvc:annotation-driven> . Estou usando o Jackson 2.7. e Spring4.3.2
SudeepShakya
Por que você não tenta isso: stackoverflow.com/questions/5349362/… Ou substituindo aquele bean: MappingJackso‌ n2HttpMessageConvert‌ er
hoang
@hoang onde delare isso em java, pois estou tentando capturar esses dados ilegais, fiz a pergunta que está aqui stackoverflow.com/questions/49676720/… , você pode me ajudar.
Vipul Singh
obrigado muito útil, a importação que usei foi: com.fasterxml.jackson.core.JsonParser.Feature;
Jesús Sánchez
1

Na plataforma Salesforce, esse erro é causado por /, a solução é evitá-los como //.

Daniel Sokolowski
fonte
2
Para mim - na plataforma Salesforce - era "\" para "\\" que era realmente necessário. Pelo menos no meu caso, ocorreu por causa de novos caracteres de linha no meu JSON. \nteve que ser alterado para \\n. Isso se deve ao fato de que JSON requer que os caracteres de controle tenham escape. Veja este excelente comentário aqui .
malte de