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

2022-09-01 08:45:30

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

返回是因为此方法的返回值被传递到其他 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不能正确解析值(当我得到一个顾问Dto而不是列表时,它就会这样做)?


答案 1

您需要执行以下操作:

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

(来自这个SO答案)

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


答案 2

进口:

import com.fasterxml.jackson.databind.ObjectMapper;

对象:

private ObjectMapper mapper = new ObjectMapper();

例子:

PremierDriverInfoVariationDTO premierDriverInfoDTO = 
mapper.convertValue(json, PremierDriverInfoVariationDTO.class); 
log.debug("premierDriverInfoDTO : {}", premierDriverInfoDTO);

Map<String, Boolean> map = mapper.convertValue(json, Map.class);
log.debug("result : {}", map);
assertFalse(map.get("eligiblePDJob"));