关于hibernate的实体类中有集合类型转化成JSON的工具类

在做项目中遇见了包含集合类型(Set,List)的实体类,转化为json时报错。报错信息为:

java.lang.StackOverflowError:该错误是由于当前线程的栈满了  ,也就是函数调用层级过多导致。在集合类型上无限的循环造成。

解决该问题,就是不用把实体类中集合类型的属性转化为json。对于也需要转化的再此文章中没有研究。


一:首先利用PropertyUtils.getPropertyDescriptors利用反射机制获取类中的属性,并 查看该属性的类型。首先写两个测试类1,bean.java和beanTest.java

package FanSheLei;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * 实体类
 * @author ZCZ
 * @time 2014-1-23
 */
public class bean implements java.io.Serializable{
	
	private String String_;
	private int int_;	
	private long long_;
	private Date date_;
	private double double_;
	private float float_;
	private boolean boolean_;
	private Set set_ = new HashSet(0);
	private List list_ = new ArrayList();
	private Map map_=new HashMap();
	public String getString_() {
		return String_;
	}
	public void setString_(String string) {
		String_ = string;
	}
	public int getInt_() {
		return int_;
	}
	public void setInt_(int int1) {
		int_ = int1;
	}
	public long getLong_() {
		return long_;
	}
	public void setLong_(long long1) {
		long_ = long1;
	}
	public Date getDate_() {
		return date_;
	}
	public void setDate_(Date date) {
		date_ = date;
	}
	public double getDouble_() {
		return double_;
	}
	public void setDouble_(double double1) {
		double_ = double1;
	}
	public float getFloat_() {
		return float_;
	}
	public void setFloat_(float float1) {
		float_ = float1;
	}
	public boolean isBoolean_() {
		return boolean_;
	}
	public void setBoolean_(boolean boolean1) {
		boolean_ = boolean1;
	}
	public Set getSet_() {
		return set_;
	}
	public void setSet_(Set set) {
		set_ = set;
	}
	public List getList_() {
		return list_;
	}
	public void setList_(List list) {
		list_ = list;
	}
	public Map getMap_() {
		return map_;
	}
	public void setMap_(Map map) {
		map_ = map;
	}
	
	
}
package FanSheLei;

import java.beans.PropertyDescriptor;

import com.sun.org.apache.commons.beanutils.PropertyUtils;
/**
 * 测试类
 * @author ZCZ
 * @time 2014-1-23
 */
public class beanTest {
	public static void main(String args[]) {
		 
		 beanTest bt=new beanTest();
		 bean bn=new bean();
		 Object obj=bn;
		 
		 bt.test(obj);
	}
	
	public void test(Object obj) 
	 { 
	  PropertyDescriptor[] pd = PropertyUtils.getPropertyDescriptors(obj);	  
		  for (int i = 0; i < pd.length; i++) {	
			  String name = pd[i].getName();
			  System.out.println(name+":该属性的类型="+pd[i].getPropertyType()+":是否实现了接口:"+(pd[i].getPropertyType()).isInterface());
		    }
	  }
	}


运行测试类的输出结果是

boolean_:该属性的类型=boolean:是否实现了接口:false
class:该属性的类型=class java.lang.Class:是否实现了接口:false
date_:该属性的类型=class java.util.Date:是否实现了接口:false
double_:该属性的类型=double:是否实现了接口:false
float_:该属性的类型=float:是否实现了接口:false
int_:该属性的类型=int:是否实现了接口:false
list_:该属性的类型=interface java.util.List:是否实现了接口:true
long_:该属性的类型=long:是否实现了接口:false
map_:该属性的类型=interface java.util.Map:是否实现了接口:true
set_:该属性的类型=interface java.util.Set:是否实现了接口:true
string_:该属性的类型=class java.lang.String:是否实现了接口:false


由输出结果可以看出集合都是集合类都是以接口实现的,根据上述测试如果想要转化的实体类不超出上述测试类型,可以在进行转化json时先进性判断,是否需要转化集合类。即可解决上述问题。下面是我的json的工具类。在项目中只需要传入实体类即可返回json数据

public class JsonUtil {

	    /**
	     * 传入任意一个 object对象生成一个指定规格的字符串
	     * 
	     * @param object 任意对象
	     * @return String
	     */
	    public static String objectToJson(Object object) {
	        StringBuilder json = new StringBuilder();
	        if (object == null) {
	            json.append("\"\"");
	        } else if (object instanceof String || object instanceof Integer || object instanceof Double || object instanceof Long) {
	            json.append("\"").append(object.toString()).append("\"");
	        } else {
	            json.append(beanToJson(object));
	        }
	        return json.toString();
	    }

	    /**
	     * 传入任意一个 Javabean对象生成一个指定规格的字符串
	     * 
	     * @param bean bean对象
	     * @return String "{}"
	     */
	    public static String beanToJson(Object bean) {
	        StringBuilder json = new StringBuilder();
	        json.append("{");
	        PropertyDescriptor[] props = null;
	        try {
	            props = Introspector.getBeanInfo(bean.getClass(), Object.class).getPropertyDescriptors();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	        if (props != null) {
	            for (int i = 0; i < props.length; i++) {
	                try {
	                	if(!(props[i].getPropertyType()).isInterface()){
		                    String name = objectToJson(props[i].getName());
		                    String value = objectToJson(props[i].getReadMethod().invoke(bean));
		                    json.append(name);
		                    json.append(":");
		                    json.append(value);
		                    json.append(",");
	                	}
	                } catch (Exception e) {
	                }
	            }
	            json.setCharAt(json.length() - 1, ‘}‘);
	        } else {
	            json.append("}");
	        }
	        return json.toString();
	    }

	    /**
	     * 通过传入一个列表对象,调用指定方法将列表中的数据生成一个JSON规格指定字符串
	     * 
	     * @param list 列表对象
	     * @return String "[{},{}]"
	     */
	    public static String listToJson(List<?> list) {
	        StringBuilder json = new StringBuilder();
	        json.append("[");
	        if (list != null && list.size() > 0) {
	            for (Object obj : list) {
	                json.append(objectToJson(obj));
	                json.append(",");
	            }
	            json.setCharAt(json.length() - 1, ‘]‘);
	        } else {
	            json.append("]");
	        }
	        return json.toString();
	    }
	
}








郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。