淘先锋技术网

首页 1 2 3 4 5 6 7

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());//北京市
    }
}

json反序列化日期null

通过以上代码,我们可以看到在反序列化时,当日期为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对象。