java - 我可以告诉杰克逊在将 Map 转换为 POJO 时简单地设置匹配类型的值,而不是反序列化和重新序列化吗?
问题描述
假设我有以下课程:
public class MyPojo {
public ZonedDateTime now;
}
要将 a 转换Map<String, Object>
为这个 POJO,根据https://stackoverflow.com/a/16430704/1225328,ObjectMapper#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 属性相同类型的值,那么只需设置它并继续”?
解决方案
您需要将jackson-datatype-jsr310
库添加到您的类路径并JavaTimeModule
在您ObjectMapper
的中注册,以便java.time
正确序列化/反序列化对象:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
这将使您的示例工作。
推荐阅读
- r - 从数据框中创建一个列表:A 列是变量,B 列与 C 列中的值相关联
- c++ - 是否强制转换为仅包含 char[] 并从该数组中读取的结构定义良好?
- reactjs - 如何强制地将 prop 分配给 React 组件?
- c# - 如何将特定图像设置为 Fluent Design AcrylicBackgroundSource
- batch-file - Windows 命令行中的文件名模式匹配
- install4j - 如何在 Windows 平台上的 Install4j 中使用 Amazon Corretto 创建 JRE 包
- vba - VBA如何撤消?
- kubernetes - 为什么在 Kubernetes 中执行系统预留的预留很危险?
- node.js - Express body 解析器无法正确解析对象
- javascript - 手风琴仅针对第一个元素以错误的方向扩展