JSON反序列化是将JSON字符串转换为特定程序语言中的对象的过程。在处理日期类型的时候,经常会遇到日期为null的情况。本文将介绍如何处理JSON反序列化日期null的问题。
//示例JSON字符串 { "name": "张三", "birthday": null, "address": "北京市" } //示例Java代码 import com.fasterxml.jackson.databind.ObjectMapper; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class User { private String name; private Date birthday; private String address; //getter和setter方法省略 } public class JsonTest { public static void main(String[] args) throws Exception { String json = "{\"name\":\"张三\",\"birthday\":null,\"address\":\"北京市\"}"; ObjectMapper mapper = new ObjectMapper(); //设置日期格式 DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); mapper.setDateFormat(df); User user = mapper.readValue(json, User.class); System.out.println(user.getName());//张三 System.out.println(user.getBirthday());//null System.out.println(user.getAddress());//北京市 } }
通过以上代码,我们可以看到在反序列化时,当日期为null时,程序会抛出异常。我们可以在程序中设置一个DefaultDateFormat代替使用SimpleDateFormat来处理null值的日期。
//解决方法 public class JsonTest { public static void main(String[] args) throws Exception { String json = "{\"name\":\"张三\",\"birthday\":null,\"address\":\"北京市\"}"; ObjectMapper mapper = new ObjectMapper(); //设置日期格式 DateFormat df = new DefaultDateFormat(); mapper.setDateFormat(df); User user = mapper.readValue(json, User.class); System.out.println(user.getName());//张三 System.out.println(user.getBirthday());//null System.out.println(user.getAddress());//北京市 } } //自定义DefaultDateFormat类 import com.fasterxml.jackson.databind.util.StdDateFormat; import java.text.ParseException; import java.util.Date; public class DefaultDateFormat extends StdDateFormat { @Override public Date parse(String dateStr) throws ParseException { if (dateStr == null || dateStr.length() == 0 || dateStr.equals("null")) { return null; } return super.parse(dateStr); } }
我们可以发现,使用自定义DefaultDateFormat之后,不再抛出异常,并成功将JSON字符串转换为Java对象。