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)
# 1 楼答案
否,错误消息表示数据为非UTF-8
它看起来是ISO-LATIN-2(或等价物),因为有问题的字符是
ł
编码为字节0xb3
你的选择取决于很多事情。如果您的数据来自外部来源,您可能对编码没有发言权(或者您可以联系数据供应商,要求他们以UTF8格式提供数据)。那你就得做点什么
在这种情况下,
InputStreamReader
将正确地将字节转换为字符,Jackson根本不需要处理字节(只是文本)。但它还要求您知道文件是使用ISO-8859-2
(即拉丁语-2)编码的有很多方法可以猜测文件的编码,但不能通过编程安全地完成,因此不能说“以正确的编码打开文件”。我知道如何调试这个问题的方法是查找常见的波兰语编码,然后查看
ł
在错误消息中用0xb3
编码的位置不幸的是,API中有许多方法使用“默认平台编码”,这并不总是UTF8。因此,您可能会编写一个您认为是UTF8格式的文件,因为您忘记显式地指定您想要UTF8,例如使用
new OutputStreamWriter(new FileOutputStream("yourfile"), StandardCharsets.UTF_8);
这适用于字节转换为字符的所有地方,反之亦然,因此文件访问、从网络套接字读取文本等等
# 2 楼答案
这个问题与Jackson无关,因为JSON接受的编码是UTF8、UTF16和UTF32
如果编写文件,可以使用
如果文件是从其他来源创建的,则必须使用正确的编码读取
然后将内容保存在UTF-8中,否则Jackson不会接受