2012-08-11 60 views
3

我使用ObjectMapper將我係統中的帖子序列化爲json。這些帖子包含來自世界各地的條目,幷包含utf-8字符。問題是ObjectMapper似乎沒有正確處理這些字符。例如,字符串「Muséed'Orsay」被序列化爲「Mus?©e d'Orsay」。ObjectMapper不正確處理UTF-8?

這裏是我的代碼,在做的系列化:

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); 
} 

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()); 
    } 

有趣的是,當我使用@ResponseBody使用以下配置通過請求處理程序返回,它完全一樣的List<Post> posts被序列化就好了

任何幫助非常感謝!

+0

它是直接返回String的控制器方法嗎? http://stackoverflow.com/questions/3616359/who-sets-response-content-type-in​​-spring-mvc-responsebody – 2012-08-11 08:02:44

+0

我認爲你應該更新這個問題,因爲問題不在ObjectMapper。 – philipp 2014-05-06 19:29:18

回答

2
從轉換

除此之外,如何簡化流程:

return objectMapper.writeValueAsString(posts); 

從而加快了進程(無需從POJO去字節數組解碼爲字符來構建字符串)以及(更重要的是)縮短代碼。

+0

完美。比我所做的要簡單得多。謝謝!! – threejeez 2012-08-11 23:21:42

1

不是10分鐘後,我發現了這個問題。這個問題不是ObjectMapper的問題,而是我將ByteArrayOutputStream轉換爲字符串的方式。我改變了代碼如下,一切都開始工作:

try { 
     return out.toString("utf-8"); 
    } catch (UnsupportedEncodingException e) { 
     return out.toString(); 
    } 
+0

不顧這一點。雖然它的工作原理@斯塔克曼的答案好得多。 – threejeez 2012-08-11 23:23:01