2014-03-12 41 views
14

我试图通过REST风格的WS从一个应用程序中的数据得到另一个和它的作品,但因为我不能施放它,我不能使用此数据... WS返回一个对象像这样的列表:如何将LinkedHashMap转换为自定义java对象?

{id=1, forename=John, surname=Bloggs, username=jbloggs, role=Graduate Developer, office=London, skills=[{technology=Java, experience=2.5}, {technology=Web, experience=2.0}, {technology=iOS, experience=0.0}, {technology=.NET, experience=0.0}]} 

让我用它杰克逊的ObjectMapper:

ObjectMapper mapper = new ObjectMapper(); 

    List<ConsultantDto> list = new ArrayList<ConsultantDto>(); 


    try { 

     list = mapper.readValue(con.getInputStream(), ArrayList.class); 

    } catch (JsonGenerationException e) { 

     e.printStackTrace(); 

    } catch (JsonMappingException e) { 

     e.printStackTrace(); 

    } catch (IOException e) { 

     e.printStackTrace(); 

    } 

后,我有3行代码:

System.out.println(list.get(0)); 
System.out.println(list.get(0).getForename()); 
return list; 

回报,因为该方法的返回值被传递到加时赛她的web服务在浏览器中显示正确的数据。有趣的事情发生的两个打印行,一个来自这篇文章的顶部打印数据({ID:1 ...}),但另外一个抛出异常:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.xxx.xxx.web.dto.rp.ConsultantDto 

ConsultantDto和SkillDto是两个合法的班其将所有属性设置为与来自WS的数据相匹配,所有getter/setter都已就位。就我而言,LinkedHashMap将东西存储为key:value对,所以我只是看不到这个异常来自哪里。我该如何解决这个问题,为什么ObjectMapper不能正确解析这个值(当我得到一个ConsultantDto而不是一个List时)?

回答

30

你需要这样做:

List<ConsultantDto> myObjects = 
    mapper.readValue(jsonInput, new TypeReference<List<ConsultantDto>>(){}); 

(从这个SO answer

,你必须使用TypeReference的原因是因为Java的一个不幸的怪癖。如果Java有适当的泛型,我敢打赌你的语法会起作用。

+0

@Enno对于泛型T类型,是否可以使用相同的东西? – Stephane

相关问题