在 SpringBoot 项目中, 如何统一 JSON 格式化中的日期格式
问题现在的关系型数据库例如PostgreSQL/MySQL, 都已经对 JSON 类型提供相当丰富的功能, 项目中对于不需要检索但是又需要结构化的存储, 会在数据库中产生很多 JSON 类型的字段, 与 Jackson 做对象的序列化和反序列化配合非常方便.
如果 JSON 都是类定义的, 这个序列化和反序列化就非常透明 -- 不需要任何干预, 写进去是什么, 读出来就是什么. 但是如果 JSON 在 Java 代码中是定义为一个 Map, 例如 Map<String, Object> 那么就有问题了, 对于 Date 类型的数据, 在存入之前是 Date, 取出来之后就变成 Long 了.
- SomePO po = new SomePO();
 - //...
 - Map<String, Object> map = new HashMap<>();
 - map.put("k1", new Date());
 - po.setProperties(map);
 - //...
 - mapper.insert(po);
 - //...
 - SomePO dummy = mapper.select(po.id);
 - // 这里的k1已经变成了 Long 类型
 - Object k1 = dummy.getProperties().get("k1");
 
查看 ObjectMapper 的源码, 可以看到其对Date格式的序列化和反序列化方式设置于_serializationConfig 和 _deserializationConfig 这两个成员变量中, 可以通过 setDateFormat() 进行修改
- public class ObjectMapper extends ObjectCodec implements Versioned, Serializable {
 -    //...
 -    protected SerializationConfig _serializationConfig;
 -    protected DeserializationConfig _deserializationConfig;
 -    //...
 
-    public ObjectMapper setDateFormat(DateFormat dateFormat) {
 -        this._deserializationConfig = (DeserializationConfig)this._deserializationConfig.with(dateFormat);
 -        this._serializationConfig = this._serializationConfig.with(dateFormat);
 -        return this;
 -    }
 
-    public DateFormat getDateFormat() {
 -        return this._serializationConfig.getDateFormat();
 -    }
 - }
 
- public SerializationConfig with(DateFormat df) {
 - 	SerializationConfig cfg = (SerializationConfig)super.with(df);
 - 	return df == null ? cfg.with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) : cfg.without(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
 - }
 
推荐阅读
- vivoX70pro和苹果11区别对比_哪款更值得入手
 - 小米10s和小米10拍照哪个好_小米10s和小米10拍照对比
 - vivox70pro+和小米11Ultra那个好_详细对比
 - 潘婷秀发补水笔多少钱_潘婷秀发补水笔用多久
 - i5 11300H和r5 5500u哪个好_i5 11300H和r5 5500u对比
 - 天玑1200和骁龙888哪个发热严重_发热对比
 - 华为mate40e和荣耀magic3对比_哪款更值得入手
 - gorm中的关联操作详解
 - 欧惠和后部分气垫对比(夏天油皮仅供参
 - 怎样使用对讲机(一张图看懂对讲机)
 
