【问题标题】:Weird error with Jackson and file encoding杰克逊和文件编码的奇怪错误
【发布时间】:2012-09-16 10:47:56
【问题描述】:

我从 S3 拉下一个文件,当我使用内容流作为裸 InputStream 调用对象映射器时,解码失败并出现 UTF-8 异常,但是当我使用包装 InputStream 的 BufferedReader 时,它工作正常.

如果我将文件读入本地文件,然后将其作为 FileInputStream 打开,也可以正常工作。我很困惑。我希望有人在我之前遇到过这个问题,或者在 Jackson 的编码方面对裸 InputStream 与 BufferedReader 的工作原理有所了解。

失败了

S3Object s3o = s3Client.getObject("my-bucket","my-key");
Object t = om.readValue(s3o.getObjectContent(), Object.class);

这行得通

S3Object s3o = s3Client.getObject("my-bucket","my-key");
Object t = om.readValue(new BufferedReader(new InputStreamReader(s3o.getObjectContent())), Object.class);

出现错误:

org.codehaus.jackson.JsonParseException: Invalid UTF-8 middle byte 0x5c
at [Source: org.apache.http.conn.EofSensorInputStream@6460029d; line: 1, column: 31611]
    at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1433)
    at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:521)
    at org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidOther(Utf8StreamParser.java:2830)
    at org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidOther(Utf8StreamParser.java:2837)
    at org.codehaus.jackson.impl.Utf8StreamParser._decodeUtf8_2(Utf8StreamParser.java:2625)
    at org.codehaus.jackson.impl.Utf8StreamParser._finishString2(Utf8StreamParser.java:1952)
    at org.codehaus.jackson.impl.Utf8StreamParser._finishString(Utf8StreamParser.java:1905)
    at org.codehaus.jackson.impl.Utf8StreamParser.getText(Utf8StreamParser.java:276)
    at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.deserialize(UntypedObjectDeserializer.java:59)
    at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.mapObject(UntypedObjectDeserializer.java:218)
    at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.deserialize(UntypedObjectDeserializer.java:47)
    at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.mapArray(UntypedObjectDeserializer.java:165)
    at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.deserialize(UntypedObjectDeserializer.java:51)
    at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.mapObject(UntypedObjectDeserializer.java:218)
    at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.deserialize(UntypedObjectDeserializer.java:47)
    at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.mapObject(UntypedObjectDeserializer.java:196)
    at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.deserialize(UntypedObjectDeserializer.java:47)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1909)

【问题讨论】:

    标签: java json amazon-s3 jackson


    【解决方案1】:

    您的内容不是 UTF-8,而是对 JSON 无效的内容,例如 ISO-8859-1 (Latin-1)。您对BufferedReader 的使用也有点错误——您应该指定编码,否则使用平台默认编码(可以是任何东西)——但它可能会从该编码转换以避免错误。 尽管如此,听起来内容不是有效的 JSON,并且生成它的人应该修复它以使用一种受支持的编码(UTF-8 或 UTF-16)。

    【讨论】:

    • 看来是这样!在本地下载文件确实允许使用 FileInputStream 读取它,但似乎这样做使 Java 了解了编码并且它弄明白了。检查文件,它被解释为 ISO-8859。
    • 好吧,这很常见,尤其是。因为最新的 HTML 规范表明默认编码(没有明确的信息)应该是 ISO-8859-1(或者任何小的变体)。唉,JSON 规范特别提到只支持 UTF-8/16/32 编码。实际上,这意味着需要使用InputStreamReader将字节转换为Reader,这样就可以了。
    猜你喜欢
    • 2021-01-09
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2020-06-30
    • 2013-11-11
    • 2014-07-06
    相关资源
    最近更新 更多