2014-02-09 67 views
6

使用Google GSON lib来处理序列化/反序列化,消耗客户端的JSON API。 这被证明是有问题的,因为在API的json实体中有很多关于API的日期格式。是使用GSON反序列化两种不同的日期格式

的一些例子如下...

“2014年2月9日”

“15/10/1976”

“2014-02-09T07:32:41 +00:00“

我无法控制API,因为它由客户端开发并且已被其他方使用。 似乎我可以设置GSON使用单一的日期格式,但我不能得到它解析每场的基础上的日期。

我本来期待GOSN为此提供一个注释,但我似乎找不到一个。 任何想法设置这个人吗?

+1

请注意,JSON没有定义标准的日期格式。日期可以是任何字符格式,也可以是自某个时间点以来的秒或毫秒 - 完全取决于发件人。 –

回答

6

由于您在POJO中有多个Date字段,并且包含JSON的日期格式不同,所以您需要为Date编写一个可以处理这些格式的自定义解串器。

class DateDeserializer implements JsonDeserializer<Date> 
{ 
    @Override 
    public Date deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException 
    { 
     String myDate = je.getAsString(); 
     // inspect string using regexes 
     // convert string to Date   
     // return Date object 
    } 

} 

创建GSON实例时,您可以将其注册为一个类型的适配器:

Gson gson = new GsonBuilder() 
       .registerTypeAdapter(Date.class, new DateDeserializer()) 
       .create(); 

你可以,当然,也只写你的POJO自定义解串器和自己从填充一切解析树。

另一种选择是在POJO中简单地将它们设置为String,然后让每个字段的获得者将它们转换为Date

除此之外,如果您没有完全使用Gson,那么Jackson JSON解析器(默认情况下)会在反序列化过程中使用POJO的setter,这会让您明确控制设置每个字段。

+0

由于GSON的局限性,不是理想的选择。谢谢(你的)信息。 –

+0

@ carrot_programmer_3另一种选择是为具有多种日期格式的类编写自定义反序列化器。虽然这可能有点乏味,但它会解决问题。 –