FastJSON初探

  目前正在开发的系统,V2.0版对V1.0版进行了大面积重构。V1.0版Bean采用下滑线命名法,
V2.0版Bean采用驼峰命名法,关键的系统间通讯功能要沿用V1.0版设计实现,JSON格式协议也
采用V1.0版下滑线命名法,从而产生了一个奇葩需求:
Bean转化为JSON对象时,Bean的所有属性名由“驼峰式”转化为“下滑线式”,所有属性值转为字符串类型。

解决方法

  1. 自己写一个类,利用“反射”,将Bean的属性名和属性值进行转化,最后组成JSON字符串。
    方案实现起来稍麻烦,且对List、Map等集合属性处理复杂。可以尝试,但不推荐。
  2. json-lib不行,只能针对某个特定对象的某种类型的属性做转化。
  3. gson没研究,网上说可行。有时间研究下。
  4. FastJSON可行,项目也有用FastJSON,所有采用FastJSON实现。

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
private static NameFilter nf = new NameFilter() {

public String process(Object object, String name, Object value) {
// TODO Auto-generated method stub
return CamelUnderlineUtil.camelToUnderline(name);
}
};

private static ValueFilter vf = new ValueFilter() {

public Object process(Object object, String name, Object value) {
// TODO Auto-generated method stub
if(value == null){
return "";
}else if(value instanceof Enum){
Method[] marr = value.getClass().getMethods();
for(Method m : marr){
if(m.getName().equals("ordinal")){
try {
return m.invoke(value, null).toString();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}else if(value instanceof Integer){
return value.toString();
}else if(value instanceof Date){
return DateUtil.format((Date)value, DateUtil.defaultDateTimePatternStr);
}else if(value instanceof BigDecimal){
return ((BigDecimal) value).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
}
return value;
}
};

String json = JSON.toJSONString(obj, new SerializeFilter[]{nf, vf});

实现关键点

  • FastJSON1.1.42及以上版本,JSON.toJSONString方法才支持SerializeFilter数组做参数。
  • 采用反射方法获取Bean中Enum类型属性值。

参考资料

静行:FastJSON实现详解