ObjectMapper将日期更改为字符串 [英] ObjectMapper changes Date to String

查看:191
本文介绍了ObjectMapper将日期更改为字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Jackson ObjectMappper将Java POJO转换为Map.但是,转换时,日期更改为字符串.

I am trying to use Jackson ObjectMappper to convert my Java POJO to Map. But, on converting, the Date changes to String.

这是我的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;
    }

我知道这已经有可能的答案了此处 .但是我的ObjectMapper已经以相同的方式配置,但仍然无法正常工作.

I know this already has a possible answer here. But my ObjectMapper is already configured in the same way and still it is not working.

这是ObjectMapper Bean:

Here is the 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;
}

推荐答案

在日期方面,我通常会像这样创建自己的自定义序列化器和反序列化器.这应该可以解决您的问题.

When it comes to Dates, I usually create my own custom serializer and deserializer like so. This should solve your problem.

@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种用于反序列化和序列化的静态方法:

Then have 2 static methods for deserialization and serialization:

    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将日期更改为字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆