【问题标题】:JsonParseException : Illegal unquoted character ((CTRL-CHAR, code 10)JsonParseException : 非法的不带引号的字符((CTRL-CHAR,代码 10)
【发布时间】:2015-10-10 19:04:48
【问题描述】:

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

我得到了这个例外:

原因:com.fasterxml.jackson.core.JsonParseException:非法 不带引号的字符((CTRL-CHAR,代码 10)):必须使用转义 要包含在字符串中的反斜杠。

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

有什么方法可以替代这个或其他解决方案吗?

【问题讨论】:

  • 您自己创建 JSON 吗?基本上,听起来您的数据损坏了……所以,如果可以的话,要么修复它,要么向制作它的人投诉。
  • this StackOverflow answer 中所述,您的JSON 是否通过jsonlint.com 正确验证?
  • Intellij IDEA 会在您打开 .json 文件后立即对其进行验证。试试看!
  • 我遇到了代码 9 问题 - 这是因为 [TAB] 字符

标签: java json character-encoding apache-httpclient-4.x


【解决方案1】:

JsonParseException : 非法的不带引号的字符((CTRL-CHAR,代码 10)

解决方案: 在您的文本中存在一个 chr TAB,在将文本放入 json 之前,使用将 chr TAB 替换为 \t

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
  • 标签是代码 9,而不是代码 10。请查看现有答案。
【解决方案2】:

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

如果在/n前加/,应该可以,需要转义换行符。

"Hello there //n start coding"

结果应该如下

Hello there
start coding

【讨论】:

    【解决方案3】:

    使用

    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 thread

    【讨论】:

    • 如何在 xml 中实现?我有 &lt;mvc:annotation-driven&gt; &lt;mvc:message-converters&gt; &lt;bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"&gt; &lt;property name="objectMapper"&gt; &lt;bean class="com.fasterxml.jackson.databind.ObjectMapper"&gt; &lt;property name="serializationInclusion" value="NON_NULL"/&gt; &lt;/bean&gt; &lt;/property&gt; &lt;property name="supportedMediaTypes" value="application/json"/&gt; &lt;/bean&gt; &lt;/mvc:message-converters&gt; &lt;/mvc:annotation-driven&gt; 。我正在使用杰克逊 2.7。和 Spring4.3.2
    • 你为什么不试试这个:stackoverflow.com/questions/5349362/… 或者覆盖那个 bean:MappingJackso‌​n2HttpMessageConvert‌​er
    • @hoang 在我试图捕获这些非法数据时,在哪里可以在 java 中删除这个,我已经问了这里的问题 stackoverflow.com/questions/49676720/…,你能帮帮我吗。
    • 谢谢真的有用,我使用的导入是:com.fasterxml.jackson.core.JsonParser.Feature;
    • 什么是mapper。请提供有关如何使用它的上下文
    【解决方案4】:

    在 Salesforce 平台上,此错误是由 / 引起的,解决方案是将这些转义为 //

    【讨论】:

    • 对我来说——在 Salesforce 平台上——实际上需要的是“\”到“\\”。至少在我的情况下,它是由于我的 JSON 中的换行符而发生的。 \n 必须更改为 \\n。这是因为 JSON 需要对控制字符进行转义。看到这个优秀的评论here
    【解决方案5】:

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

    {"foo": "bar
    baz"}
    

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

    {"foo": "bar\nbaz"}
    

    【讨论】:

    • 不幸的是,我有新行的原因是因为字符串很大,我希望它可读。实际的新行使字符串有助于实现这一目标
    • @juanchito 在文字中添加换行符会改变文字的内容。您不能仅仅为了可读性而添加它们,因为它会改变它们的含义。将换行符放在标记之间而不是在它们内部。无论如何,在您提交服务器时为服务器格式化;之前或之后的人类可读性无关紧要,应单独处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2020-12-15
    • 2011-06-18
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多