如何配置GSON以识别ISO日期字段并将其解析为Date对象?

zf9nrax1  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(201)

此代码:

Map<String, Object> map = new HashMap<>();
map.put("now", new Date());

Gson gson = new GsonBuilder()
        .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
        .create();
String json = gson.toJson(map);
System.out.println(json);

会产生{"now":"2023-03-11T12:34:56.789Z"}
相反,按如下方式撤消操作:

Map<String, Object> map = gson.fromJson(json, new TypeToken<Map<String, Object>>(){}.getType());

无法生成输入数据-而是给出类似{"now":"2023-03-11T12:34:56.789Z"}的输出。
日期字符串仍为字符串,而不会转换回Date对象。
如何将字符串解析回Map,以便GSON识别日期字符串并将其解析回Date对象?
正则表达式模式"\\d{1,4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}\\.\\d{3}Z"大致与日期模式相关。
基本上,我需要通过配置告诉GSON:如果字符串与regex部分(DATE_PATTERN)匹配,则将其反序列化为日期。

  • 注意:我知道反序列化到一个带有日期字段的类可以正常工作,因为字段类型给了GSON一个提示。我需要GSON根据字符串的格式来确定目标类型。*
7qhs6swi

7qhs6swi1#

这是不可能的;Gson不允许覆盖Object的默认类型适配器工厂。
可能有以下替代方案:

  • 使用Gson对Map进行反序列化后,手动对其进行处理并转换值
  • 拥有一个以Object作为字段类型的模型类(如果由于某种原因无法直接指定Date),然后在指定自定义适配器工厂的字段上放置一个@JsonAdapter注解
  • 指定Date实现的通用接口之一(SerializableCloneableComparable)作为Map的值类型,例如Map<String, Serializable>,然后为该接口注册类型适配器工厂。这可能不是一个非常干净的解决方案,当然,只有在Map的其他反序列化值也实现该接口时才有效。
  • Map注册一个自定义类型适配器工厂,该工厂执行值的转换

相关问题