相信大家都用过 Fastjson,阿里的一个开源 JSON 库,在阿里系的开源项目里应用得非常广泛。虽然有时候也被戏称“沉的快”,但 Fastjson 从功能丰富度、易用性、源码设计角度来看,都是一款十分优秀的工具库。
在使用 Fastjson 时,经常会配置一些枚举参数,比如日期格式、格式化输出、NULL值格式啊等等,就像下面这样配置:
String jsonStr = JSON.toJSONString(obj,
SerializerFeature.WriteDateUseDateFormat,
SerializerFeature.PrettyFormat,
SerializerFeature.WriteNullStringAsEmpty);
// JSON.toJSONString
public static String toJSONString(Object object, SerializerFeature... features);
这种配置方式用起来那是相当爽,要什么输出配置,利用 JAVA 的可变长度参数(varargs)直接在方法后面动态追加就行;要是再加上 import static,那么连 SerializerFeature 都不用写了。
不过细想一下,这种动态传的参数数组,Fastjson 在接受后怎么知道我们具体传了哪些参数?接受时遍历数组,每次 equals 对比吗?比如这样:
// 写三个 for 循环的原因是大概率下,不同 feature 处理时机不同,所以不能在一个 for 循环内处理
for (SerializerFeature feature : features) {
if(feature.equals(SerializerFeature.WriteDateUseDateFormat)){
// solve WriteDateUseDateFormat
}
}
for (SerializerFeature feature : features) {
if(feature.equals(SerializerFeature.PrettyFormat)){
// solve PrettyFormat
}
}
for (SerializerFeature feature : features) {
if(fea