如何将LinkedHashMap转换为自定义java对象?

我正在尝试通过RESTful WS将数据从一个应用程序转移到另一个应用程序并且它可以正常工作,但我无法使用此数据,因为我无法转换它… WS返回一个对象List,如下所示:

{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}]} 

让我使用Jackson的ObjectMapper:

 ObjectMapper mapper = new ObjectMapper(); List list = new ArrayList(); 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服务。 有趣的事情发生在两条打印行中,一条打印来自此post顶部的数据({id:1 …}),另一条打印exception:

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

ConsultantDto和SkillDto是两个合法的类,它们的所有属性都设置为匹配来自WS的数据,所有的getter / setter都已到位。 就我而言,LinkedHashMap将东西存储为键:值对,所以我只是看不出这个exception的来源。 我如何解决它,为什么ObjectMapper只是正确解析值(当我得到一个ConsultantDto而不是List时它会这样做)?

你需要这样做:

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

(从这个SO回答 )

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