GSON抛出异常解析空Date字段

时间:2012-02-07 21:46:06

标签: java json gson

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

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

...

Employee对象有一个Date字段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)

通常的方法是什么?

2 个答案:

答案 0 :(得分:35)

如果你无法控制输入(即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

答案 1 :(得分:2)

那是因为它是一个空字符串,Date不知道如何处理。如果你查看GSON Code,它表明它只是使用DateFormat.parse盲目地解析字符串,而不能很好地处理引号。

您是否尝试过使用null?如果为空,请尝试使用null。从用于DateTypeAdapter的GSON代码的代码中,它可以很好地处理JSONNull对象,它只是跳过它们。