在 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中的关联操作详解
- 欧惠和后部分气垫对比(夏天油皮仅供参
- 怎样使用对讲机(一张图看懂对讲机)