当前位置: 首页 > 知识库问答 >
问题:

Jackson对象映射器不能读取UTF-8

冷正青
2023-03-14

和标题一样,杰克逊无法阅读utf-8。

第37行:

ArrayNode arrayNode1 = objectMapper.readValue(bansFile, ArrayNode.class);

21:48:55[严重]com。fasterxml。杰克逊。果心JsonParseException:无效的UTF-8起始字节0xb3位于[Source:(文件);第18行,第38列]

这里是第18行,看不懂UTF-8"

"理由":"管理员nie poda的Powodu banicji"

整个StackTrace

21:48:55 [SEVERE]     at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1840)
21:48:55 [SEVERE]     at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:712)
21:48:55 [SEVERE]     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidInitial(UTF8StreamJsonParser.java:3569)
21:48:55 [SEVERE]     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidChar(UTF8StreamJsonParser.java:3565)
21:48:55 [SEVERE]     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2(UTF8StreamJsonParser.java:2511)
21:48:55 [SEVERE]     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishAndReturnString(UTF8StreamJsonParser.java:2437)
21:48:55 [SEVERE]     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.getText(UTF8StreamJsonParser.java:293)
21:48:55 [SEVERE]     at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:267)
21:48:55 [SEVERE]     at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeArray(JsonNodeDeserializer.java:437)
21:48:55 [SEVERE]     at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer$ArrayDeserializer.deserialize(JsonNodeDeserializer.java:141)
21:48:55 [SEVERE]     at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer$ArrayDeserializer.deserialize(JsonNodeDeserializer.java:126)
21:48:55 [SEVERE]     at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
21:48:55 [SEVERE]     at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3070)
21:48:55 [SEVERE]     at koral.proxyban.listeners.ServerConnect.isBanned(ServerConnect.java:37)
21:48:55 [SEVERE]     at koral.proxyban.listeners.ServerConnect.onProxyConnect(ServerConnect.java:25)

共有2个答案

樊腾
2023-03-14

这个问题与Jackson无关,因为JSON接受的编码是UTF8、UTF16和UTF32。

如果你写的文件,你可以保存它使用

OutputStreamWriter writer = new OutputStreamWriter(
                  new FileOutputStream("yourfile"), StandardCharsets.UTF_8);

如果文件是从其他来源创建的,则必须使用正确的编码读取

BufferedReader br = new BufferedReader(new InputStreamReader(
                   new FileInputStream("yourfile"), SOME_CHARSET));

然后将内容保存在UTF-8中否则Jackson不会接受

吴哲
2023-03-14

不,错误消息是数据不是UTF-8。

它看起来是ISO-LATIN-2(或等效字符),因为违规字符是ł编码为字节0xb3

你的选择取决于很多事情。如果您的数据来自外部来源,您可能对编码没有发言权(或者您可以联系数据供应商,要求他们以UTF8格式提供数据)。那你就得做点什么

BufferedReader br = new BufferedReader(new InputStreamReader(
               new FileInputStream("yourfile"), "ISO-8859-2");    
objectMapper.readValue(br, ArrayNode.class);

在这种情况下,InputStreamReader将正确地将字节转换为字符,Jackson将根本不必处理字节(只是文本)。但它也要求您知道文件是使用ISO-8859-2编码的。拉丁语-2).

有很多方法可以猜测文件的编码,但不能通过编程安全地完成,因此不能说“以正确的编码打开文件”。我知道如何调试这个问题的方法是查找常见的波兰语编码,然后查看ł在错误消息中用0xb3编码的位置。

不幸的是,API中有许多方法使用“默认平台编码”,这并不总是UTF8。因此,您可能会编写一个您认为是UTF8格式的文件,因为您忘记了显式指定您想要UTF8,例如使用new OutputStreamWriter(new FileOutputStream(“yourfile”)、StandardCharset。UTF_8)

这适用于字节转换为字符的所有地方,反之亦然,因此文件访问、从网络套接字读取文本等等。

 类似资料:
  • 我有一个用例,其中我需要维护两组JSON输出,一组具有JSON属性的漂亮名称,另一组没有。所以我决定自定义ObjectMapper,以便它忽略字段上的@JSONProperty(“pretty name”)注释,而使用字段属性名。在本例中,希望得到以下JSON输出 具有漂亮名称的JSON输出如下所示 我的ObjectMapper配置代码如下所示 我看了一些其他的答案,但对我不起作用。我得到了一个N

  • 初始化服务器时,出现以下错误: java.lang.IllegalStateException:无法将[java.lang.String]类型的值转换为属性“Object Mapper”所需的类型[org.codehaus.jackson.map.objectMapper]:在org.springframework.beans.typeConverterDelegate.ConvertifEmen

  • 假设我有这样的物体 我正在使用RestTemboard类从URL中获取json,如下所示: 之后,我想使用jackson对象映射器将json字符串转换为一个对象 将实体类作为第二个参数传递 问题是我应该如何编写ExampleJson实体来处理get-Showed json?我试过这样上课,但似乎不管用。 我得到了这样一个例外:

  • 我写了一个CGM服务器。在那里,我使用了Jackson对象映射器。(不确定我使用了正确的库:jackson-all-1.9)在运行以下异常后发生。 组织。科德豪斯。杰克逊。地图JsonMappingException:未找到类内容的序列化程序,也未找到创建BeanSerializer的属性(为了避免异常,请在空BEANS上禁用SerializationConfig.Feature.FAIL_))

  • 因此,我得到了一个庞大的JSON文件,我需要从中提取数据。JSON格式如下所示: 为了阅读它,我试图创建一个类来映射键和对象。类似这样的东西,类似于这个问题: 但是我被数组卡住了,它包含了更多的对象,而不仅仅是简单的基本数据类型。 JSON文件很大,并且在其中到处都有类似类型的项。我对此相当陌生,可能会犯一些错误。任何朝着正确方向的帮助都是感激的。谢了!

  • 我使用此链接中的以下代码为我的一个数据模型类(JSON到JAXB模型的转换)添加自定义反序列化程序。 我想使用com。fasterxml。杰克逊。jaxrs。json。JacksonJaxbJsonProvider,用于其他数据模型的JSON序列化/反序列化。 JacksonJaxbJsonProvider的默认实现非常适合我的JAXB模型,将超类作为抽象类。但是,一旦我提供了自己的自定义Obje