我正在尝试通过 RESTful WS 将数据从一个应用程序获取到另一个应用程序并且它可以工作,但我无法使用这些数据,因为我无法转换它... WS 返回一个对象列表,如下所示:
{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<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;
return 因为这个方法的返回值被传递给在浏览器中显示正确数据的其他 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 将内容存储为键:值对,所以我只是看不出这个异常来自哪里。我该如何解决它,为什么 ObjectMapper 不能正确解析值(当我得到一个 ConsultantDto 而不是 List 时它会这样做)?
最佳答案
你需要这样做:
List<ConsultantDto> myObjects =
mapper.readValue(jsonInput, new TypeReference<List<ConsultantDto>>(){});
(来自SO answer)
您必须使用 TypeReference
的原因是 Java 的一个不幸的怪癖。如果 Java 有适当的泛型,我敢打赌你的语法会奏效。
关于java - 如何将 LinkedHashMap 转换为自定义 java 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22358872/