相信很多朋友的项目中会用到Ajax,并且也会有Hibernate框架,当2者同时存在,并且需要把Java对象乃至Java集合对象封装成Json形式的String时会出现一些异常.
现在网上有很多的Json工具类,但是很少有能解析Hibernate配置了级联系关系以后的那种,即使有也是改了底层代码,调试起来非常的复杂.试想如果关系是客户和订单一对多,订单和商品种类一对多,商品种类和商品一对多,商品和..&&(*&()我已经说不下去了,如果是这样一个关系,单单用他们的工具格式会是怎么样的?
{"customer":"god",{"order":"CN-2008-8-8CN",{"shopType":"vagetable",{"shop":"beef"}}}}.....以此类推,如果属性一多,别说前台调用,根本看都看不清楚.有的人说设置Hibernate的延迟加载可以避免这个尴尬,但是貌似Hibernate默认就是延迟加载,我用的一个JsonUtil工具解析的时候经常出错.于是只好自己动手写一个方法,这个方法把所有的非当前对象里的基本属性全部过滤掉,例如:School, Order, Customer等. 只需要纯的某个对象的所有key和value.这种格式封装的JsonString就很好打印了. 下面是这段代码..
public Map getObjectForMap(Object obj) {
//存放obj对象基本属性,不包括级联对象
Map<Object, Object> map = new HashMap<Object, Object>();
//obj对象的Class
Class userClass = null;
//obj对象的所有方法
Method[] userMethod = null;
//obj对象的所有字段
Field[] userField = null;
//obj对象单个属性的名字
String fieldName = null;
//obj对象单个属性的类型
String fieldType = null;
//截取后的obj对象单个属性名字,用来匹配属性对应的set/get方法. 如username,截后成为sername 匹配setUsername或getUsername方法
String newFieldName = null;
//obj对象单个方法的名字
String methodName = null;
//obj对象单个方法的类型
String methodType = null;
//SimpleDateFormat对象用来格式化时间..把时间变成字符串形式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm");
//arg参数代表存放时间被格式化后的字符串
String arg = null;
try{
userClass = obj.getClass();
userMethod = userClass.getDeclaredMethods();
userField = userClass.getDeclaredFields();
//遍历所有属性...
for(int num = 0; num < userField.length; num++) {
//单个属性名字
fieldName = userField[num].getName();
//单个属性的类型
fieldType = userField[num].getType().getName();
//如果属性名属于obj对象的基本属性(也就是非级联属性,例如:School school 为级联属性)..
//此出过滤所有的非当前对象基本类型..如果有需要可以再此处增加新的类型,例入:StampTime等..
if(fieldType.equals("java.lang.String")
|| fieldType.equals("java.lang.Integer")
|| fieldType.equals("int")
|| fieldType.equals("java.util.Date")) {
//截取后的属性名,username 截取为sername;
newFieldName = fieldName.substring(1, fieldName.length());
//遍历所有方法
for(int index = 0; index < userMethod.length; index++) {
//单个方法名
methodName = userMethod[index].getName();
//单个方法的返回类型
methodType = userMethod[index].getReturnType().getName();
//选取所有方法前缀为get并且方法名与属性名匹配的方法..
if(methodName.indexOf(newFieldName) != -1 && methodName.indexOf("get") != -1) {
//格式化Date为String
if(methodType.equals("java.util.Date")) {
arg = sdf.format(userMethod[index].invoke(obj));
map.put(fieldName, arg);
} else {
map.put(fieldName, userMethod[index].invoke(obj));
}
}
}
}
}
} catch (Exception e) {
System.out.println(e.toString() + " 运行出错..");
}
return map;
}
返回map以后,再用网上常见的Json工具包里的转Map为JsonString格式的方法一处理就可以很好的丢到前台打印啦....