最近在写接口,要把list集合转换为json串返回。例如
List<order> orders = orderService.findAll();
JSONArray array = JSONArray.fromObject(orders);
可能出现java.lang.StackOverflowError:该错误是由于当前线程的栈满了 ,也就是函数调用层级过多导致。在集合类型上无限的循环造成。
有时候会出现There is a cycle in the hierarchy!这个异常是由于JSONObject插件内部会无限拆解你传入的对象,直到没有可拆解为止,问题就在这,如果你传入的对象有外键关系,或者相互引用,那么内部就会死循环,也就会抛出这个异常。
我用的是mybatis,试了很多方法都不行,最后把对象都变成Map对象就不会出现错误了。
下面是List集合转化为Map的方法。
package test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONArray;
public class ObjectToMap {
/*
* 将object转换为Map,不包含object继承属性
*/
public static Map<String, String> getFieldVlaue(Object obj) throws Exception {
Map<String, String> mapValue = new HashMap<String, String>();
Class<?> cls = obj.getClass();
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
String name = field.getName();
String strGet = "get" + name.substring(0, 1).toUpperCase() + name.substring(1, name.length());
Method methodGet = cls.getDeclaredMethod(strGet);
Object object = methodGet.invoke(obj);
String value = object != null ? object.toString() : "";
mapValue.put(name, value);
}
return mapValue;
}
/*
* 将List<object>转换为List<Map>
*/
public static List<Map> getFieldVlaueList(List<?> objects)throws Exception{
List<Map> mapList = new ArrayList<Map>();
for(Object obj:objects){
mapList.add(getFieldVlaue(obj));
}
return mapList;
}
public static void main(String[] args) throws Exception {
javaBean test = new javaBean();
test.setPassword("1234");
test.setUsername("admin");
Map<String, String> mapList =getFieldVlaue(test);
JSONArray array = JSONArray.fromObject(mapList);
System.out.println(array.toString());
}
}