/**
* 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的原码。。。看懵了。。由此可见。。自身还是很菜,。,,
上面注释少。。。因为写的很乱。。就去掉了。。