相用json-lib 过滤属性,网上搜了一下,都是过滤第一级别的,需要重写 config,filed 什么的。觉得很麻烦,然后搜了下别的实现方案,阿里巴巴的 fastjson 很不错
实现如下:
SimplePRopertyPreFilter filter = new SimplePropertyPreFilter(TTown.class, "id","townname"); response.getWriter().write(JSONObject.toJSONString(townList,filter)); 只要指定二级属性的类名就可以了,很方便。但是如果就想用json-lib 怎么弄呢?我不想改config ,filter什么的,于是自己写
public class Test { public static void main(String[] args) throws Exception { Entity e1 = new Entity(); e1.setAge(1); e1.setId(1); e1.setName("e1"); e1.setSex("male"); Entity e2 = new Entity(); e2.setAge(2); e2.setId(2); e2.setName("e2"); e2.setSex("female"); List<Entity> list = new ArrayList<Entity>(); list.add(e1); list.add(e2); Map map = new HashMap(); map.put("id", 1); map.put("name", "bruce"); map.put("list", list); JSONObject json = JSONObject.fromObject( map ); System.out.println(json.toString()); //----------------------------------- String[] names = {"sex"}; map = convert(map,names); System.out.println("---------------------"); json = JSONObject.fromObject( map ); System.out.println(json.toString()); } static Map convert(Map para,String[] names) throws Exception{ List<Map> result = new ArrayList<Map>(); List list = (List) para.get("list"); for(Object ob :list){ Map map = new HashMap(); Field[] fs = ob.getClass().getDeclaredFields(); for(Field f : fs){ if(!contains(names, f.getName())){ f.setaccessible(true); //设置些属性是可以访问的 Object val = f.get(ob); map.put(f.getName(), val); } } result.add(map); } para.put("list", result); return para; } static boolean contains(String[] strs ,String str){ if(null == strs || strs.length == 0){ return false; } for(int i=0;i<strs.length;i++){ if(strs[i].equals(str)){ return true; } } return false; } }大体思路是 将list 中的实体遍历,利用反射过滤属性,生成一个新的map .塞回list中。然后再把新的list赋值给原始的map。生成json 。运行结果如下:{"name":"bruce","id":1,"list":[{"sex":"male","name":"e1","id":1,"age":1},{"sex":"female","name":"e2","id":2,"age":2}]}---------------------{"name":"bruce","id":1,"list":[{"name":"e1","id":1,"age":1},{"name":"e2","id":2,"age":2}]}
将二级属性list 中的 sex 属性过滤掉了
新闻热点
疑难解答