/** * list转json * @param list 需要转换的list * @param map 转换哪些字段 (aaa%%bbb%%ccc,"aaa") 字段名,json键名 * @param dateFormat 格式化的日期类型 * @return */ public static String listToJson(List list,Map<String,String>map,DateFormat dateFormat){ List<String>methodNamea = new ArrayList<String>(); List<String>methodNameb = new ArrayList<String>(); Iterator it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry e = (Map.Entry) it.next(); if(e.getKey().toString().indexOf("%%")==-1){ methodNamea.add(e.getKey().toString()); }else{ methodNameb.add(e.getKey().toString()); } } StringBuilder sb = new StringBuilder(); try{ String oneData=""; String methodName = ""; String attr=""; String methodNames=""; Method[] methods=null; for(int q=0;q<list.size();q++){ sb.append("{"); Object obj = list.get(q); methods = obj.getClass().getMethods(); //先把单个字段的转换json for(int i=0;i<methodNamea.size();i++){ methodName="get"+methodNamea.get(i); attr=methodNamea.get(i); for(int k=0;k<methods.length;k++){ Method m = methods[k]; if(m.getName().toLowerCase().equals(methodName.toLowerCase())){ Object t = m.invoke(obj,null); if(map.get(attr)==null){ sb.append("'"+attr+"':"); }else{ sb.append("'"+map.get(attr)+"':"); } sb.append("'"+t.toString()+"',"); break; } } } //非单个字段转换JSON for(int i=0;i<methodNameb.size();i++){ methodNames= methodNameb.get(i); String[]tempNames = methodNames.split("%%"); Object objjk = null; boolean sunObjIsNull=false; for(int k=0;k<tempNames.length;k++){ methodName="get"+tempNames[k]; attr=tempNames[k]; if(objjk!=null){ methods=objjk.getClass().getMethods(); }else{ if(sunObjIsNull){ if(map.get(methodNames)==null){ sb.append("'"+methodNames+"':"); }else{ sb.append("'"+map.get(methodNames)+"':"); } sb.append("'',"); break; } } if(q==4&&i==1){ int qq=0; } for(int j=0;j<methods.length;j++){ Method m = methods[j]; if(m.getName().toLowerCase().equals(methodName.toLowerCase())){ Class returnClass = m.getReturnType(); if(returnClass.getCanonicalName().indexOf("java.")!=-1){ if(map.get(methodNames)==null){ sb.append("'"+methodNames+"':"); }else{ sb.append("'"+map.get(methodNames)+"':"); } Object t = m.invoke(objjk,null); if(t instanceof Date){ sb.append("'"+dateFormat.format((Date)t)+"',"); }else if(t instanceof Timestamp){ Timestamp ts = (Timestamp)t; sb.append("'"+dateFormat.format(new Date(ts.getTime()))+"',"); }else if(t==null){ sb.append("'',"); }else{ sb.append("'"+t.toString()+"',"); } }else{ if(objjk==null){ objjk = m.invoke(obj,null); if(objjk==null){ sunObjIsNull=true; } }else{ objjk = m.invoke(objjk,null); } } break; } } } methods = obj.getClass().getMethods(); } oneData= sb.substring(0,sb.length()-1); sb.delete(0,sb.length()); sb.append(oneData); sb.append("},"); } oneData=null; methodName = null; attr=null; methodNames=null; methods=null; }catch(Exception ee){ ee.printStackTrace(); } return sb.substring(0,sb.length()-1); }
上面是代码。。。
Map<String,String>map = new HashMap<String,String>(); //map 两个参数 第一个是字段名 第二个是转成json后的键 如果第2个参数为null 则默认一字段名为 json的键
// map.put("id",null);
// map.put("name",null);
// map.put("money",null);
// map.put("brand%%brandAddress","brandAddress");
// map.put("brandnewtype%%content","content");
// map.put("journal%%magtype%%name","magtypeName");
这个是传入的map对象。
map.put("journal%%magtype%%name","magtypeName");
这个就是list里面一个对象a 需要对象a的journal字段的magtype的字段的name属性。。。。(键)。。。值。。。就是转成json后的键名称
本人新手一枚。。。对于怎么优化也不知道啊。。懵懂的设了几个null。。。
写这个目的是因为hibernate实体关系配了很多,。。用json-lib.jar这个包转json的话会转了很多没用的属性。还有就是关联关系 死循环问题。。。这需要把几个set的属性过滤。。。。总之觉得很麻烦。。。
然后写了这个,。对比了和json-lib的性能。。。少量数据下速度是比json-lib快很多的。(2500个简单类型左右)。。 。。。
数据量大又会造成内存溢出。。。。。。。。。。。。
希望碰巧看过的大神优化优化。。。。我也看了下json-lib的原码。。。看懵了。。由此可见。。自身还是很菜,。,,
上面注释少。。。因为写的很乱。。就去掉了。。