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

标签 java json web-services

我正在尝试通过 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/

相关文章:

java - 如何从 org.springframework.test.web.servlet.ResultActions 中提取显式内容

javascript - 有没有办法将包含日期的字符串数组从服务器端传递到客户端?

python - 如何使用正则表达式检查 JSON 最后一个键的值是否以逗号结尾?

java - 如何覆盖 Jersey REST Web 服务的默认 xml 生成

java - 复制临时文件

java - 我们可以在抽象类中使用静态方法吗?

java - 在一个框架中处理多个面板

java - 建立网站的步骤

c# - 迫切需要在 C# 中使用 YQL 逐步进行基本的 oauth 签名?

.net - 如何调用将 ArrayList 返回给 Android 的 .net Web 服务