GSON 抛出异常解析空的日期字段

2022-09-04 05:31:22

我正在使用GSON来反序列化一些JSON。JSON 是:

{
    "employee_id": 297,
    "surname": "Maynard",
    "givenname": "Ron",
    "lastlogin": "",

...

员工对象具有“日期”字段“上一次登录:

public class Employee {
private Integer employee_id;

private String surname;

private String givenname;

private Date lastlogin;

我遇到的问题是,当 lastlogin 值未填充时,它是 JSON 中的空字符串,因此 GSON 解析器会抛出:

java.text.ParseException: Unparseable date: ""
at java.text.DateFormat.parse(DateFormat.java:337)
at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:79)
at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:66)

解决这个问题的通常方法是什么?


答案 1

如果您无法控制输入(即JSon生成部分),但知道格式在不为空时应该如此,则只需编写自己的解串器即可处理空值,例如

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        @Override
        public Date deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context)
                throws JsonParseException {
            try {
                return df.parse(json.getAsString());
            } catch (ParseException e) {
                return null;
            }
        }
    });
    Gson gson = gsonBuilder.create();

查看 https://sites.google.com/site/gson/gson-user-guide#TOC-Custom-Serialization-and-Deserializ


答案 2

这是因为它是一个空字符串,Date 不知道如何处理。如果你看一下GSON代码,它会显示它只是盲目地使用DateFormat.parse解析字符串,这不能很好地处理引号。

你试过使用空值吗?如果为空,请尝试使用 null。从日期类型Adapter的GSON Code的代码中,它可以很好地处理JSONNull对象,它只是跳过它们。