3

ObjectMapper を使用して、システム内の投稿を json にシリアル化しています。これらの投稿には、世界中からのエントリが含まれており、utf-8 文字が含まれています。問題は、ObjectMapper がこれらの文字を適切に処理していないように見えることです。たとえば、文字列「Musée d'Orsay」は「Mus?©e d'Orsay」としてシリアル化されます。

シリアル化を行っている私のコードは次のとおりです。

public static String toJson(List<Post> posts) {
        ObjectMapper objectMapper = new ObjectMapper()
            .configure(Feature.USE_ANNOTATIONS, true);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            objectMapper.writeValue(out, posts);
        } catch (JsonGenerationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return new String(out.toByteArray());
    }

興味深いことに、List<Post> posts次の構成を使用して @ResponseBody を使用してリクエスト ハンドラー経由で返すと、まったく同じものが正常にシリアル化されます。

public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    ObjectMapper m = new ObjectMapper()
        .enable(Feature.USE_ANNOTATIONS)
        .disable(Feature.FAIL_ON_UNKNOWN_PROPERTIES);
    MappingJacksonHttpMessageConverter c = new MappingJacksonHttpMessageConverter();
    c.setObjectMapper(m);
    converters.add(c);
    super.configureMessageConverters(converters);
}

どんな助けでも大歓迎です!

4

2 に答える 2

2

変換とは別に、プロセスを次のように単純化するのはどうですか。

return objectMapper.writeValueAsString(posts);

これにより、プロセスが高速化され(POJOからバイト、配列に移動して、文字列を構築するために文字にデコードする必要がなくなります)、(さらに重要なことに)コードが短縮されます。

于 2012-08-11T22:30:56.573 に答える
1

10分も経たないうちに問題が見つかりました。問題は ObjectMapper ではなく、ByteArrayOutputStream を文字列に変換する方法にありました。次のようにコードを変更すると、すべてが機能し始めました。

try {
        return out.toString("utf-8");
    } catch (UnsupportedEncodingException e) {
        return out.toString();
    }
于 2012-08-11T08:12:01.837 に答える