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.Datejava.util.Calendarjava.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 将日期更改为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串日期范围更改为开始和结束日期?

MySQL - 将日期字符串更改为日期类型?

将日期更改为字符串格式

将 JavaScript Date 对象转换为 JSON 字符串时日期更改为前一天

无法使用应用程序脚本格式化日期如何将字符串更改为日期

python 将中文日期字符串更改为datetime对象