相用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 屬性過濾掉了
新聞熱點
疑難解答