基于 fastjson 1.x
我们在打日志的时候,习惯把对象用 fastjson 转换成字符串后再交给日志打印。
像下面这样:
但等我们需要通过日志里的日期排查问题时就傻眼了,看到的日志是这个样子的:
看到都是时间戳,还得拷出来找个时间戳转换工具才能知道真实的时间。
看到这里是不是突然意识到这确实是个痛点啊,只是平时也没多想凑合看了。
那么怎么才能把 Date 类型的数据,自动序列化成人类一眼就能看懂的年月日呢?
像这样
如果只有几个类,这么写一下还行,如果想要日志里再也看不到时间戳,那得把整个工程里都加上这个注解,不可行。
public static String toJSONString(Object object, SerializerFeature... features) {
return toJSONString(object, DEFAULT_GENERATE_FEATURE, features);
}
JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat)
这个方案的好处是不用在属性上加 @JSONField 注解了,在需要打日志的地方使用这个方法序列化就可以。
缺点:所有打日志的地方都要考虑使用哪个序列化方法
SerializeConfig config = new SerializeConfig();
config.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
System.out.println(JSON.toJSONString(bill, config));
这个和方案 2 类似,缺点也一样,不多说了。
这个方案需要依赖 SpringMVC ,具体就是下面的这个方法:
原理是提供一个 HttpMessageConverter,在这个 converter 中设置 fastjson 序列化的格式。
@Configuration
public class FastJsonConverterConfig {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteNullBooleanAsFalse
SerializerFeature.WriteDateUseDateFormat
);
fastConverter.setFastJsonConfig(fastJsonConfig);
//全局指定了日期格式
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
HttpMessageConverter> converter = fastConverter;
return new HttpMessageConverters(converter);
}
}
不知为什么,从网上搜 “fastjson全局日期格式化解决方案” 时,搜到的都是这个方案,就粘过来一段代码,看着很高大上,但是和我的期望相差很远。
这个方案限制太多,需要依赖 Spring,而且主要用于和前端页面数据交互时的处理。
灵感还是源自上面的方案 3,研究了 SerializeConfig 的源码后发现其内部自带一个全局的实例,而且还是 public 的,正好可以为我所用。
只需一行代码(可以在项目启动时设置上)
SerializeConfig.getGlobalInstance().put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
通过这行代码就可以全局设置 Date 类型的属性序列化的格式了。
以后打日志还像原来直接使用 JSON.toJSONString(Object object) 就可以。
看看效果
注意 !!!
终极方案是全局的设置,会影响所有的 JSON 序列化,需要评估自己项目中 fastjson 的使用场景是否受影响。
反正我经手的项目没看到过什么高级的用法,
要么是 JSON.toJSONString(Object object),
要么是 JSONObject.parseObject(String text, Class clazz )。
扯两句
打能看得懂的日志
好体验始于小细节
原创不易,多多关注,一键三连,感谢支持!