使用ObjectMapper' setDateFormat'的不同输出和使用@JsonDeserialize的自定义日期反序列化程序

时间:2017-08-28 08:17:16

标签: java json date simpledateformat json-deserialization

我正在尝试使用ObjectMapper将文件中存在的JSON转换为Java对象。

JSON文件:sample-date-str.json

{
    "eventDate"="2017-06-27 10:04:26.573503+05:30"
}

Java POJO:SampleDatePOJO

class SampleDatePOJO{

    private Date eventDate;

    getter and setter....

    toString...
}

将JSON转换为Java对象的Java代码:

ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSX")); //this will convert Date to IST format which is okay.
SampleDatePOJO sampleDatePOJO = mapper.readValue(new File("sample-date-str.json"), SampleDatePOJO.class);
System.out.println(sampleDatePOJO.getEventDate()); //this gives output "Tue 
Jun 27 10:43:59 IST 2017"
  

注意:如果我删除mapper.setDateFormat(..)并使用@JsonFormat(pattern =" yyyy-MM-dd HH:mm:ss.SSSSSSX",timezone =" IST&# 34;)on' eventDate'它提供相同的输出。

自定义Deserilaizer的Java代码

public class CustomDateDeserializer extends JsonDeserializer<Date>{

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSXXX");

        Date dateTmp = null;
        try {
            dateTmp = sdf.parse(p.getValueAsString());
        } catch (ParseException e) {

            e.printStackTrace();
        }
        return dateTmp;
    }
}

如果我使用上面的@JsonDeserialize注释注释&#39; eventDate&#39;字段为:

@JsonDeserialize(using=CustomDateDeserializer.class)

收到的输出是:

System.out.println(sampleDatePOJO.getEventDate()); //"Tue Jun 27 10:13:59 IST 2017"

这是正确的毫秒&#34; 573503&#34;部分被添加到日期。

我需要理解为什么我的ObjectMapper setDateFormat和@JsonFormat不起作用。或者,如果它们正常工作,为什么输出与SimpeDateFormat格式相同。 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您是否注意到,在前两次转换中,您在日期模式中使用单X (yyyy-MM-dd HH:mm:ss.SSSSSSX)。 但在自定义脱胶剂中,您使用的是XXX (yyyy-MM-dd HH:mm:ss.SSSSSSXXX)

这种模式差异实际上造成了所有差异(相差30分钟)。如果你在不同的机制中使用相同的模式,那么输出也将保持不变。