实体转json串。能满足普通list的转换。。及一些些简单的对象.对象.属性的转换《还未完善--对象.集合》

时间:2021-08-27 09:59:48
/**
	 * 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的原码。。。看懵了。。由此可见。。自身还是很菜,。,,

上面注释少。。。因为写的很乱。。就去掉了。。