JsonParseException: недопустимый символ без кавычек ((CTRL-CHAR, код 10)

98

Я пытаюсь использовать org.apache.httpcomponentsRest API, который будет отправлять данные в формате JSON в API.

Я получаю это исключение:

Вызвано: com.fasterxml.jackson.core.JsonParseException: недопустимый символ без кавычек ((CTRL-CHAR, код 10)): для включения в строку необходимо экранировать с помощью обратной косой черты.

Причина в том, что ctrl-charон включен в строку JSON.

Есть ли способ заменить то или иное решение?

Цзянь Чжун
источник
1
Вы сами создаете JSON? По сути, это похоже на то, что у вас поврежденные данные ... так что либо исправьте их, если можете, либо пожаловаться тому, кто их производит.
Джон Скит
1
Как обсуждалось в этом ответе StackOverflow , правильно ли ваш JSON проверяется через jsonlint.com ?
Эрик МакКормик,
Идея Intellij проверяет это, как только вы открываете файл .json. Попытайся!
Gaurav

Ответы:

88

Это может произойти, если у вас есть символ новой строки (или другой управляющий символ) в строковом литерале JSON.

{"foo": "bar
baz"}

Если вы производите данные, замените фактические символы новой строки на экранированные "\\n"при создании строковых литералов.

{"foo": "bar\nbaz"}
пироспад
источник
58

С помощью

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

См. 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.
 */

Старый вариант JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARSустарел с 2.10.

См. Также ветку на github .

ханг
источник
как это реализовать в xml? У меня есть <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> . Я использую Jackson 2.7. и Spring4.3.2
SudeepShakya
Почему бы вам не попробовать это: stackoverflow.com/questions/5349362/… Или переопределить этот bean-компонент: MappingJackso‌ n2HttpMessageConvert‌ er
hoang
@hoang, где сделать это в java, поскольку я пытаюсь захватить эти незаконные данные, я задал вопрос, который находится здесь stackoverflow.com/questions/49676720/… , не могли бы вы мне помочь.
Випул Сингх
спасибо, действительно полезный, импорт, который я использовал, был: com.fasterxml.jackson.core.JsonParser.Feature;
Хесус Санчес
1

На платформе Salesforce эта ошибка вызвана тем /, что решение состоит в том, чтобы избежать их как //.

Даниэль Соколовски
источник
2
Для меня - на платформе Salesforce - на самом деле было необходимо от "\" до "\\". По крайней мере, в моем случае это произошло из-за символов новой строки в моем JSON. \nпришлось изменить на \\n. Это связано с тем, что JSON требует экранирования управляющих символов. Смотрите этот отличный комментарий здесь .
malte 06