【问题标题】:Request body with a non UTF-8 character throws JSON parse error: Invalid UTF-8 start byte 0xae , 0xfc带有非 UTF-8 字符的请求正文引发 JSON 解析错误:无效的 UTF-8 起始字节 0xae , 0xfc
【发布时间】:2020-07-20 11:09:34
【问题描述】:

解析 JSON 请求正文时出现以下异常,

请求正文有一个特殊字符“®”(非 UTF-8),解析时失败。如何处理请求正文中的非 UTF-8 字符?

{
    "fields": [
        {
            "fieldLabel": "data®"
        }
    ]
}

我想用特殊字符保存对象。我尝试研究并找不到合适的解决方案。 提前致谢。

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Invalid UTF-8 start byte 0xae; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Invalid UTF-8 start byte 0xae
 at [Source: (PushbackInputStream); line: 1, column: 907] (through reference chain: java.util.ArrayList[0]->com.model.TableDefinition["field"]->java.util.ArrayList[1]->com.model.FieldDefinition["fieldLabel"])

【问题讨论】:

  • JSON 必须以 UTF8 编码。您能否修复发出请求的任何内容,以便发送正确的 JSON?
  • 不存在“非 UTF-8 字符”之类的东西。任何 Unicode 字符都可以用 UTF-8 编码。您的 JSON 显然是使用与 UTF-8 不同的字符编码进行编码的——这很奇怪且不寻常,并且可能意味着在生成此 JSON 的任何系统中都存在错误。如果您无法修复该其他系统中的错误,那么您可以通过使用它所在的 actual 字符编码而不是 UTF-8 来解析 JSON 来解决它。
  • 在 ISO-8859-1 编码(以及许多其他 ISO-8859-xx 编码)中,® 被编码为 0xae。请求正文可能使用 ISO-8859-1 或类似的。尽管非 Unicode 编码对于 JSON 来说非常罕见,但检查请求的内容类型可能是有意义的。它应该将编码指示为application/json; charset=iso-8859-1
  • 我发现问题出在生成 json 的源系统中,我在标题中添加了以下编码内容,解决了问题“headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON.toString ()+ ";charset=UTF-8"); "

标签: java json spring-boot gradle jackson


【解决方案1】:

在标头的内容类型中添加“charset=UTF-8”解决了这个问题:

headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON.toString()  + ";charset=UTF-8")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    相关资源
    最近更新 更多