JsonParseException:非法未引用字符((CTRL-CHAR,代码10)

149
我正在尝试使用org.apache.httpcomponents消费Rest API,它会将JSON格式的数据发布到API。

我遇到了这个异常:

 

Caused by: com.fasterxml.jackson.core.JsonParseException:非法未引用字符((CTRL-CHAR, code 10)):必须使用反斜杠进行转义才能包含在字符串中。

原因是因为JSON字符串中包含了ctrl-char

是否有任何方法可以替换这个或其他解决方案?


1
你是自己创建 JSON 吗?基本上,听起来你的数据有问题...所以如果可以的话,请修复它,否则去向生产它的人投诉。 - Jon Skeet
1
正如在这个StackOverflow答案中所讨论的那样,您的JSON是否通过jsonlint.com正确验证? - Eric McCormick
Intellij IDEA 会在你打开 .json 文件时立即对其进行验证。试试看吧! - Gaurav
我遇到了代码9问题 - 这是因为[TAB]字符。 - yossico
5个回答

132

如果在JSON字符串文字中有换行符(或其他控制字符),就会出现这种情况。

{"foo": "bar
baz"}

如果您是产生数据的人,请在创建字符串文字时使用转义后的新行 "\\n" 替换实际的新行。

{"foo": "bar\nbaz"}

不幸的是,我有新行的原因是字符串很长,我希望它易于阅读。实际的新行使得字符串朝着这个目标更加努力。 - juanchito
2
@juanchito 在字面量中添加换行符会改变字面量的本质。你不能仅仅为了可读性而在其中添加换行符,因为这会改变它们的含义。应该在标记之间放置换行符而不是在标记内部。无论如何,在提交给服务器时都应该将格式化的内容处理好;人类可读性在此之前或之后并不重要,应该分别处理。 - Matthew Read
1
在发送有效载荷之前,您可以修剪换行符,以获得可读性和正确的JSON。 - Jade Steffen

87

使用

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

自2.10版本起,旧选项JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS已被弃用。

请参见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和Spring 4.3.2。 - SudeepShakya
为什么你不试试这个:https://dev59.com/nW435IYBdhLWcg3wjwzS 或者覆盖那个bean:MappingJackson2HttpMessageConverter。 - hoang
@hoang,请问在Java中应该在哪里声明这个变量?我正在尝试捕获这些非法数据,我已经在这里提出了问题:https://stackoverflow.com/questions/49676720/post-illegal-unquoted-character-in-json-data-as-a-request?noredirect=1#comment86384077_49676720,请问能否帮助我解决问题? - Vipul Singh
非常感谢,我使用的导入是:com.fasterxml.jackson.core.JsonParser.Feature; - Jesús Sánchez
1
什么是“mapper”。请提供它的使用上下文。 - juanchito
1
这是Jackson的ObjectMapper,请参见:https://github.com/FasterXML/jackson - hoang

1
在Salesforce平台上,这个错误是由/引起的,解决方法是将其转义为//

3
在Salesforce平台上,我需要的是从 "" 改为 "\"。至少在我的情况下,这是由于JSON中的换行符所致。\n必须更改为\\n。这是因为JSON需要转义控制字符。请参见此处的优秀评论。 - malte

0

当您向服务器发送JSON数据时,会出现此错误。 也许在您的字符串中,您正在尝试使用/n添加换行符。

如果在/n之前添加/,它应该可以工作,您需要转义换行符。

"Hello there //n start coding"

结果应该如下所示

Hello there
start coding

-1

JsonParseException:非法的未引用字符((CTRL-CHAR,代码10)

解决方案: 在将文本放入json之前,请检查文本中是否存在chr TAB,并使用replace chr TAB to \t进行替换。


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
制表符是代码9,而不是代码10。请查看现有的答案。 - Matthew Read

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接