JsonParseException: carácter ilegal sin comillas ((CTRL-CHAR, código 10)

94

Estoy tratando de usar org.apache.httpcomponentspara consumir una API Rest, que publicará datos en formato JSON en la API.

Obtengo esta excepción:

Causado por: com.fasterxml.jackson.core.JsonParseException: carácter ilegal sin comillas ((CTRL-CHAR, código 10)): debe escaparse usando una barra invertida para ser incluido en la cadena.

El motivo es que ctrl-charestá incluido en la cadena JSON.

¿Hay alguna forma de reemplazar esta o alguna otra solución?

jian zhong
fuente
1
¿Estás creando el JSON tú mismo? Básicamente, parece que tienes datos dañados ... así que arréglalos si puedes o quéjate con quien los esté produciendo.
Jon Skeet
1
Como se discutió en esta respuesta de StackOverflow , ¿su JSON se valida correctamente a través de jsonlint.com ?
Eric McCormick
Intellij idea lo valida tan pronto como abre el archivo .json. ¡Intentalo!
Gaurav

Respuestas:

84

Esto puede suceder si tiene una nueva línea (u otro carácter de control) en un literal de cadena JSON.

{"foo": "bar
baz"}

Si usted es el que produce los datos, reemplace las nuevas líneas reales con las de escape "\\n"al crear sus literales de cadena.

{"foo": "bar\nbaz"}
pyrospade
fuente
56

Utilizando

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

Ver 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.
 */

La opción anterior JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARSquedó obsoleta desde la 2.10.

Consulte también el hilo de github .

hoang
fuente
¿cómo implementar esto en xml? Tengo <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> . Estoy usando Jackson 2.7. y Spring4.3.2
SudeepShakya
¿Por qué no intentas esto? Stackoverflow.com/questions/5349362/… O anulando ese bean: MappingJackso‌ n2HttpMessageConvert‌ er
hoang
@hoang, dónde retrasar esto en Java, ya que estoy tratando de capturar estos datos ilegales, hice la pregunta que está aquí stackoverflow.com/questions/49676720/… , ¿pueden ayudarme?
Vipul Singh
gracias realmente útil, la importación que usé fue: com.fasterxml.jackson.core.JsonParser.Feature;
Jesús Sánchez
1

En la plataforma Salesforce, este error es causado por /, la solución es escapar de estos como //.

Daniel Sokolowski
fuente
2
Para mí, en la plataforma Salesforce, era "\" a "\\" lo que realmente se necesitaba. Al menos en mi caso, ocurrió debido a nuevos caracteres de línea en mi JSON. \ntuvo que cambiarse a \\n. Esto se debe al hecho de que JSON requiere que se escapen los caracteres de control. Vea este excelente comentario aquí .
Malta