【问题标题】:deserialize two different date formats with GSON使用 GSON 反序列化两种不同的日期格式
【发布时间】:2014-02-09 18:30:08
【问题描述】:

我正在使用 google 的 GSON lib 使用客户端 JSON API 来处理序列化/反序列化。 这被证明是有问题的,因为在 API 的 json 实体中,API 中散布着许多日期格式。

这方面的一些例子如下...

“2014-02-09”

“1976 年 15 月 10 日”

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

我无法控制 API,因为它由客户端开发并且已被其他方使用。 似乎我可以将 GSON 设置为使用单一日期格式,但我无法让它按字段解析日期。

我希望 GOSN 会为此提供注释,但我似乎找不到。 有什么想法可以设置这个吗?

【问题讨论】:

  • 请注意,JSON 没有定义标准的日期格式。日期可以是任何字符格式,也可以是自某个纪元日期以来的秒数或毫秒数——这完全取决于发送者。

标签: java json gson


【解决方案1】:

由于您的 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,然后让每个字段的 getter 将它们转换为 Date

除此之外,如果您不完全依赖使用 Gson,Jackson JSON 解析器(默认情况下)在反序列化期间使用您的 POJO 的设置器,这将使您可以显式控制设置每个字段。

【讨论】:

  • 由于 GSON 的限制,并不理想。感谢您的信息。
  • @carrot_programmer_3 当然,另一种选择是为具有多种日期格式的类编写自定义反序列化器。虽然写起来可能有点乏味,但它会解决问题。
猜你喜欢
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多