日期:2014-05-16  浏览次数:20386 次

ajax打印对象时,转换由java对象转为Json格式的String时遇到的Hibernate问题

相信很多朋友的项目中会用到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格式的方法一处理就可以很好的丢到前台打印啦....

1 楼 wkcgy 2011-05-29  
如果需要显示配置了级联关系的属性时如何操作呢?