首页 > 解决方案 > 我可以告诉杰克逊在将 Map 转换为 POJO 时简单地设置匹配类型的值,而不是反序列化和重新序列化吗?

问题描述

假设我有以下课程:

public class MyPojo {
    public ZonedDateTime now;
}

要将 a 转换Map<String, Object>为这个 POJO,根据https://stackoverflow.com/a/16430704/1225328ObjectMapper#convertValue可以使用:

Map<String, Object> myMap = new HashMap<String, Object>(){{
    put("now", ZonedDateTime.now());
}};
ObjectMapper objectMapper = new ObjectMapper();
MyPojo myPojo = objectMapper.convertValue(myMap, MyPojo.class);

上面的代码虽然失败了,但:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.ZonedDateTime` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

ZonedDateTime我认为杰克逊首先将地图的值“反序列化”为 a Map<String, Object>,然后尝试ZonedDateTime从这个生成的地图重建一个实例以设置 POJO 的now属性。

我不需要那么聪明的东西;有没有办法告诉杰克逊“如果您在输入映射中找到一个与名称与键匹配的 POJO 属性相同类型的值,那么只需设置它并继续”?

标签: javadictionaryjacksonpojoconverters

解决方案


您需要将jackson-datatype-jsr310库添加到您的类路径并JavaTimeModule在您ObjectMapper的中注册,以便java.time正确序列化/反序列化对象:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());

这将使您的示例工作。


推荐阅读