我想禁用宽松选项中Jackson Deserializer
严格反序列化日期字段。
基本上,我希望下面的代码抛出异常而不是
解析33-Aug-2016
as 02-Sep-2016
.
1.订单.java
package com.test.date;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
public class Order {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MMM-yyyy")
private Date orderDate;
public Date getOrderDate() {
return orderDate;
}
public void setOrderDate(Date orderDate) {
this.orderDate = orderDate;
}
public String getFormattedDate() {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
return "[ " + sdf.format(getOrderDate()) + " ]";
}
}
2.TestJackson.java
package com.test.date;
import java.io.IOException;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TestJackson {
public static void main(String[] args) throws JsonParseException,
JsonMappingException, IOException {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
sdf.setLenient(false);
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(sdf);
Order order = mapper.readValue("{\"orderDate\" : \"33-Aug-2016\"}",
Order.class);
System.out.println(order.getFormattedDate());
}
}
Output
[ 2016 年 9 月 2 日 ]
我可以实现自己的反序列化器类来执行此操作,但我正在寻找一些基于注释或对象映射器设置方法。
UPDATE:
我决定使用自定义反序列化器实现并发现另一个问题,但是序列化现在。更新后的代码如下所示:
1.订单.java
package com.test.date;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
public class Order {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MMM-yyyy")
@JsonDeserialize(using = DateDeserializer.class)
private Date orderDate;
public Date getOrderDate() {
return orderDate;
}
public void setOrderDate(Date orderDate) {
this.orderDate = orderDate;
}
@JsonIgnore
public String getFormattedDate() {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
return "[ " + sdf.format(getOrderDate()) + " ]";
}
}
使用自定义解串器,日期验证可以完美工作。但是,同一对象的序列化存在问题。请看下面:
2.TestJackson.java
package com.test.date;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TestJackson {
public static void main(String[] args) throws JsonParseException,
JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
Order order = mapper.readValue("{\"orderDate\" : \"22-Aug-2016\"}",
Order.class);
System.out.println(mapper.writeValueAsString(order));
}
}
Output
{“orderDate”:“2016 年 8 月 21 日”}
这种一日之差从何而来?
是否必须提供自定义实现Serializer
如果我们使用自定义的Deserializer
?