有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jackson objectMapper无法读取UTF8

正如在标题中,杰克逊不能阅读utf-8

第37行:

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

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

这是第18行,无法读取UTF-8“ł”

“原因”:“局长nie podałpowodu banicji”

整个堆栈跟踪

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) 个答案

  1. # 1 楼答案

    否,错误消息表示数据为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"), StandardCharsets.UTF_8);

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

  2. # 2 楼答案

    这个问题与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不会接受