ObjectMapper 将日期更改为字符串
Posted
技术标签:
【中文标题】ObjectMapper 将日期更改为字符串【英文标题】:ObjectMapper changes Date to String 【发布时间】:2019-06-18 12:09:06 【问题描述】:我正在尝试使用 Jackson ObjectMappper 将我的 Java POJO 转换为 Map。但是,在转换时,日期更改为字符串。
这是我的 POJO:
public class Sample
@Id
private String id;
private Date date;
public String getId()
return id;
public void setId(String id)
this.id = id;
public Date getDate()
return date;
public void setDate(Date date)
this.date = date;
这是我的代码:
@Test
public void testGenMap()
Sample sample = new Sample();
sample.setId("a");
sample.setDate(new Date());
Map<String, Object> map = generateMap(sample);
System.out.println(map.get("date") instanceof Date); //false
private Map<String, Object> generateMap(Sample sample)
Map<String, Object> map = CommonsContextUtil.getBean(ObjectMapper.class).convertValue(sample,Map.class);
map.values().removeIf(Objects::isNull);
return map;
我知道这已经有一个可能的答案here。但是我的 ObjectMapper 已经以相同的方式进行了配置,但仍然无法正常工作。
这是 ObjectMapper Bean:
@Bean
public ObjectMapper objectMapper()
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper;
【问题讨论】:
我相信您需要为此目的使用自定义解串器。或者你可以查看这个帖子***.com/questions/50171472/… 尝试将'Sample.class'传递给映射器对象的'readValue()'方法。 仅供参考,非常麻烦的旧日期时间类,例如java.util.Date
、java.util.Calendar
和 java.text.SimpleDateFormat
现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。
从这里更好地使用解决方案:***.com/questions/6796187/…。 ObjectMapper 丢失了对象类型信息。
【参考方案1】:
谈到日期,我通常会像这样创建自己的自定义序列化器和反序列化器。这应该可以解决您的问题。
@Bean
public ObjectMapper objectMapper()
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
registerModule(
new SimpleModule("foo")
.addDeserializer(Date.class, new DateDeserializer())
.addSerializer(Date.class, new DateSerializer())
);
return mapper;
然后有2个静态方法进行反序列化和序列化:
public static class DateSerializer extends StdScalarSerializer<Date>
public DateSerializer()
super(Date.class);
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider provider)
throws IOException
String output = value.toString();
gen.writeString(output);
public static class DateDeserializer extends StdScalarDeserializer<Date>
public DateDeserializer()
super(Date.class);
@Override
public LocalDate deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException
try
return Date.parse(p.getValueAsString());
catch (Exception e)
return null;
【讨论】:
它使 ObjectMapper 创建一个键值对,其中值是一个字符串。是的,它是一个由日期填充的字符串,但这不是必需的。以上是关于ObjectMapper 将日期更改为字符串的主要内容,如果未能解决你的问题,请参考以下文章