此代码:
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根据字符串的格式来确定目标类型。*
1条答案
按热度按时间7qhs6swi1#
这是不可能的;Gson不允许覆盖
Object
的默认类型适配器工厂。可能有以下替代方案:
Map
进行反序列化后,手动对其进行处理并转换值Object
作为字段类型的模型类(如果由于某种原因无法直接指定Date
),然后在指定自定义适配器工厂的字段上放置一个@JsonAdapter
注解Date
实现的通用接口之一(Serializable
、Cloneable
或Comparable
)作为Map的值类型,例如Map<String, Serializable>
,然后为该接口注册类型适配器工厂。这可能不是一个非常干净的解决方案,当然,只有在Map的其他反序列化值也实现该接口时才有效。Map
注册一个自定义类型适配器工厂,该工厂执行值的转换