JsonParseException: caractère illégal non entre guillemets ((CTRL-CHAR, code 10)

94

J'essaie d'utiliser org.apache.httpcomponentspour consommer une API Rest, qui publiera des données au format JSON sur l'API.

J'obtiens cette exception:

Causé par: com.fasterxml.jackson.core.JsonParseException: Caractère illégal sans guillemets ((CTRL-CHAR, code 10)): doit être échappé en utilisant une barre oblique inverse pour être inclus dans la chaîne.

La raison en est que ctrl-charest inclus dans la chaîne JSON.

Existe-t-il un moyen de remplacer cette solution ou une autre?

jian zhong
la source
1
Créez-vous le JSON vous-même? Fondamentalement, il semble que vous ayez des données brisées ... alors corrigez-les si vous le pouvez ou portez plainte à celui qui les produit.
Jon Skeet
1
Comme indiqué dans cette réponse StackOverflow , votre JSON est-il validé correctement via jsonlint.com ?
Eric McCormick
Intellij idea le valide dès que vous ouvrez le fichier .json. Essayez-le!
Gaurav

Réponses:

84

Cela peut se produire si vous avez une nouvelle ligne (ou un autre caractère de contrôle) dans un littéral de chaîne JSON.

{"foo": "bar
baz"}

Si vous êtes celui qui produit les données, remplacez les nouvelles lignes réelles par des échappées "\\n"lors de la création de vos chaînes littérales.

{"foo": "bar\nbaz"}
pyrospade
la source
56

En utilisant

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

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

L'ancienne option JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARSétait obsolète depuis la 2.10.

Veuillez également consulter le fil de discussion github .

hoang
la source
comment implémenter cela en xml? J'ai <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> . J'utilise Jackson 2.7. et Spring4.3.2
SudeepShakya
Pourquoi ne pas essayer ceci: stackoverflow.com/questions/5349362/... Ou remplacer ce bean: MappingJackso‌ n2HttpMessageConvert‌ er
hoang
@hoang où supprimer cela en java alors que j'essaie de capturer ces données illégales, j'ai posé la question qui se trouve ici stackoverflow.com/questions/49676720/… , pouvez-vous s'il vous plaît m'aider.
Vipul Singh
merci vraiment utile, l'importation que j'ai utilisée était: com.fasterxml.jackson.core.JsonParser.Feature;
Jesús Sánchez
1

Sur la plate-forme Salesforce, cette erreur est causée par /, la solution consiste à les échapper comme //.

Daniel Sokolowski
la source
2
Pour moi - sur la plate-forme Salesforce - c'était "\" à "\\" qui était réellement nécessaire. Au moins dans mon cas, cela s'est produit à cause de nouveaux caractères de ligne dans mon JSON. \ndevait être changé en \\n. Cela est dû au fait que JSON nécessite l'échappement des caractères de contrôle. Voir cet excellent commentaire ici .
malte