2

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)
4

1 に答える 1

2

コンテンツは UTF-8 ではありませんが、ISO-8859-1 (Latin-1) のような JSON では無効です。の使用BufferedReaderも少し間違っています-エンコーディングを指定する必要があります。そうしないと、プラットフォームのデフォルトのエンコーディング(何でもかまいません)が使用されます-しかし、おそらくエラーを回避するためにそのエンコーディングから変換されます。それにもかかわらず、コンテンツは有効な JSON ではないようです。コンテンツを作成する人は、サポートされているエンコーディング (UTF-8 または UTF-16) のいずれかを使用するように修正する必要があります。

于 2012-09-26T02:50:40.187 に答える