【发布时间】:2020-06-06 02:06:19
【问题描述】:
我正在尝试使用 Jackson ObjectMapper 从对象中获取地图:
ObjectMapper oMapper = ObjectMapperWithDate.getObjectMapper();
Map<String, Object> map = oMapper.convertValue(obj, Map.class);
我在使用日期字段时遇到问题,因为在地图中它们正在变成长对象。
我添加了反序列化器,如ObjectMapper changes Date to String
public class ObjectMapperWithDate {
@Bean
public static ObjectMapper getObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.registerModule(
new SimpleModule("foo")
.addDeserializer(Date.class, new DateDeserializer())
.addSerializer(Date.class, new DateSerializer())
);
return mapper;
}
public static class DateSerializer extends StdScalarSerializer<Date> {
public DateSerializer() {
super(Date.class);
}
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider provider)
throws IOException {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
String output = formatter.format(value);
gen.writeString(output);
}
}
public static class DateDeserializer extends StdScalarDeserializer<Date> {
public DateDeserializer() {
super(Date.class);
}
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
try {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
return formatter.parse(p.getValueAsString());
} catch (Exception e) {
return null;
}
}
}
}
当然,对映射器的调用看起来有点不同:
ObjectMapper oMapper = ObjectMapperWithDate.getObjectMapper();
Map<String, Object> map = oMapper.convertValue(obj, Map.class);
现在 Date 对象成为地图中的 String 对象。在其中正确表示日期。 但我需要它们 保持 为 Date 类型。有趣的是,如果我在反序列化器中设置断点,它永远不会到达。因此,我认为永远无法到达反序列化器,这是因为序列化后的映射器根据 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 将 Date 设为 String 或 Long,并且在反序列化时永远不会识别 Date。
如何让 Date 属性在映射后保持 Date 属性?我需要他们被认出来。
顺便说一句,BigDecimal 属性变成了 Double 属性。似乎是类似的问题,但这两种类型对我进一步的工作没有太大的区别。
【问题讨论】:
标签: java serialization jackson mapping deserialization