由于从数据库获取到的总是有空值或者”“的情况,而且从数据库获取到数据封装到java中,再转换成json数据格式,这种事情已经司空见惯了。
但是在某些特定的场合下json数据中空值或者”“的会影响项目的运行,查错的情况下也不直观。例如下面这种情况下
上图只是json的一小部分,后面还有很多没有截出来。写过微信公众号的应该知道这是自定义菜单的json数据格式,但是其中有些属性是多余的。所以空值和”“还有空list都需要从该json数据段中去除。
我处理json是用json-lib包。以下是获取数据到输出的步骤
- 从数据库中获取javabean数据
- 创建JsonConfig对象
- 创建PropertyFilter匿名内部类,并设定规则
- 把PropertyFilter对象填充到JsonConfig对象中
- javabean转换为json
- 输出json
其中创建PropertyFilter匿名内部类,并设定规则是重中之重,PropertyFilter是一个接口,里面只有一个apply方法,返回值是boolean,返回true时过滤该属性。PropertyFilter源码如下
JsonObject中调用的代码如下
当没有设置JsonPropertyFilter时,跳过该代码段。如果设置了,就调用apply方法,返回false时,跳过该代码段,当apply方法返回true时跳出该循环(即不解析该属性,直接处理下一属性)。
完整代码
@Test
public void createMenuTest(){
CustomMenuService customMenuService = (CustomMenuService) context.getBean("customMenuService");
List<CustomMenuCreate> menus = customMenuService.getCreateMenu();
//设置过滤json格式
JsonConfig jsonConfig = new JsonConfig();
PropertyFilter filter = new PropertyFilter() {
public boolean apply(Object object, String fieldName, Object fieldValue) {
if(fieldValue instanceof List){
List<Object> list = (List<Object>) fieldValue;
if (list.size()==0) {
return true;
}
}
return null == fieldValue || "".equals(fieldValue);
}
};
jsonConfig.setJsonPropertyFilter(filter);
JSONArray jsonArray = JSONArray.fromObject(menus,jsonConfig);
JSONObject jsonObject = new JSONObject();
jsonObject.put("button", jsonArray);
System.out.println(jsonArray.toString());
}