`
dengminghua1016
  • 浏览: 129091 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转 解决json转换hibernate 结果集对象

    博客分类:
  • java
 
阅读更多
在使用ext+ssh框架过程中,当使用jsonlib 转换 hibernate的延迟加载对象时,会出现报错。为解决此处错误,我们可以参考网友网上给的解决思路,大概就是:


	public static JsonConfig getCommonConfig() {
		/*---- 做属性配置 start------*/
		JsonConfig conf = new JsonConfig();
		conf.registerJsonBeanProcessor(   
	            org.hibernate.proxy.HibernateProxy.class,   
	            new HibernateJsonBeanProcessor());   
	        conf.setJsonBeanProcessorMatcher(new HibernateJsonBeanProcessorMatcher());
		return conf;
	}

}

class HibernateJsonBeanProcessorMatcher extends JsonBeanProcessorMatcher {   
  
    @Override  
    public Object getMatch(Class target, Set set) {   
    if (target.getName().contains("$$EnhancerByCGLIB$$")) { 
        return org.hibernate.proxy.HibernateProxy.class;   
    }   
    return DEFAULT.getMatch(target, set);   
    }   
}

class HibernateJsonBeanProcessor implements JsonBeanProcessor {   
    public JSONObject processBean(Object obj, JsonConfig jsonConfig) {   
    	 LazyInitializer lazyInitializer = ((HibernateProxy)obj).getHibernateLazyInitializer(); 
         if(lazyInitializer.isUninitialized()) { 
         } 

    return new JSONObject();   
    }   
}




在这种情况下,报错是解决了,但是输出的json对象串却是xxx:{}。
但是还需要这些数据,网上给出问题解决办法是使用vo之类的,个人感觉这样需要创建非长多的vo,使用繁琐。于是乎自己就琢磨使用反射,把hibernate的代理对象的数据取出来,转化为普通对应对象。结果还好,成功了。但是性能未进行测试,个人认为反射会带来性能的损失。现在代码贴出来,大家拍砖,分析哪方面需要改进。

目前只能支持一级抓取。

在使用ext+ssh框架过程中,当使用jsonlib 转换 hibernate的延迟加载对象时,会出现报错。为解决此处错误,我们可以参考网友网上给的解决思路,大概就是:
/**
	 * 
	    * 功能描述:  解决hibernate 延迟加载对象问题
	    * @param dataList 数据集
	    * @param clazz 结果集内对象的class
	    * @return: void
	    * @author: lb
	    * @version: 2.0
	 */
	public static List listCrawl(List dataList,Class clazz){
		String ss="java.lang.String,java.util.Date,java.lang.Integer,java.lang.Long,int,float,long";
		String filterType="java.util.Map,java.util.HashMap,java.util.Set,java.util.HashSet";
		try{
		for(int i=0;i<dataList.size();i++){
			Object originalObj=dataList.get(i);//原始数据对象
			Method[] originalMethods= clazz.getDeclaredMethods();//原始数据对象的方法
			for(Method originalMethod:originalMethods){
				System.out.println("original MethodName:  "+originalMethod.getName());
				if(originalMethod.getName().contains("get")){
					System.out.println("getMethod returnType: "+originalMethod.getReturnType().getName());
					String returnType=originalMethod.getReturnType().getName();//get方法返回的对象类型
					if(!ss.contains(returnType)&&!filterType.contains(returnType)){//不是基本类型和Set Map等集合,即是二级对象
						Object proxyObjct=originalMethod.invoke(originalObj, null);//二级hibernate代理对象
						if(proxyObjct!=null){//二级代理对象是否为空
						Class proxyClass=proxyObjct.getClass();
						Method[] proxyMethods=proxyClass.getDeclaredMethods();
						
						Class tempClazz=Class.forName(returnType);//创建一个hibernate代理的原始二级对象
						Object tempObject=tempClazz.newInstance();//创建一个hibernate代理的原始二级对象
						
						for(Method proxyMethod:proxyMethods ){//
							if(ss.contains(proxyMethod.getReturnType().getName())){//只抓取hibernate代理的二级对象的基础数据
							if(proxyMethod.getName().contains("get")){
								Object returnValue=proxyMethod.invoke(proxyObjct, null);//
								System.out.println("proxy  returnValue:"+returnValue);
								String setMethod=proxyMethod.getName().replace("get", "set");
								System.out.println("setMethod name:"+setMethod);
								Method tempMethod=tempClazz.getDeclaredMethod(setMethod, proxyMethod.getReturnType());
								tempMethod.invoke(tempObject, returnValue);
							}
							}
						}
						Method originalMethod1=clazz.getDeclaredMethod(originalMethod.getName().replace("get", "set"), originalMethod.getReturnType());
						originalMethod1.invoke(originalObj, tempObject);//为原始对象重新装入一个非hibernate代理对象
						
						}
						
					}
					}
			}
		}
		}catch(Exception e){
			System.out.println("处理加载对象出现问题");
			e.printStackTrace();
		}
		
		return dataList;
	}


在这种情况下,报错是解决了,但是输出的json对象串却是xxx:{}。
但是还需要这些数据,网上给出问题解决办法是使用vo之类的,个人感觉这样需要创建非长多的vo,使用繁琐。于是乎自己就琢磨使用反射,把hibernate的代理对象的数据取出来,转化为普通对应对象。结果还好,成功了。但是性能未进行测试,个人认为反射会带来性能的损失。现在代码贴出来,大家拍砖,分析哪方面需要改进。

目前只能支持一级抓取。

在使用ext+ssh框架过程中,当使用jsonlib 转换 hibernate的延迟加载对象时,会出现报错。为解决此处错误,我们可以参考网友网上给的解决思路,大概就是:
分享到:
评论

相关推荐

    JSON ——数据库结果集转换

    标题和描述均提到了“JSON —— 数据库结果集转换”,这主要涉及到将数据库查询结果转化为JSON格式的数据,以便于在网络传输中使用。在现代Web开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换...

    JSON--List集合转换成JSON对象详解

    以上知识点,不仅包括了将List集合转换为JSON对象的基本方法,还涉及到了在实际开发中可能遇到的问题及其解决方法,包括对特定框架和库的使用,对敏感数据的过滤等。掌握了这些知识点,对于进行Web开发和数据交换的...

    json转换工具jackson

    本文将深入探讨Jackson作为JSON转换工具的关键知识点,并基于提供的博文链接进行补充。 1. **Jackson库介绍** Jackson是一个开源项目,其核心库为`com.fasterxml.jackson.core`,包括`jackson-databind`、`jackson...

    json转换工具

    1. **对象到JSON转换**:你可以通过`net.sf.json.JSONObject`类的静态方法`fromObject()`将Java对象转换为JSON对象。例如,如果你有一个`User`对象,可以这样转换: ```java User user = new User(); // 设置user...

    List对象转JSON对象jar包

    在JSON转换过程中,它可能用于辅助数据结构的处理,比如遍历、过滤或者转换List。 4. **commons-lang-2.6.jar**:Apache Commons Lang是一个包含大量实用工具方法的Java类库,用于补充Java的标准库。在List到JSON的...

    json数据转换jar包

    2. **转换功能**:json-lib可以将Java对象(如ArrayList、HashMap)直接转换为JSON格式,也可以将JSON字符串解析成对应的Java对象。 3. **与其他技术的集成**:json-lib也支持与Hibernate、Struts、Spring等框架的...

    java jackson 将对象转json时,忽略子对象的某个属性操作

    当我们将Java对象转换为JSON格式时,有时我们可能需要忽略某些特定属性,特别是子对象的特定属性。本文将详细讲解如何使用Jackson来实现这一功能。 首先,Jackson提供了一个`@JsonIgnoreProperties`注解,用于忽略...

    jackjson类型转换各种方法

    本文将深入探讨Jackson框架在JSON转换中的各种方法,帮助你更好地理解和应用这个强大的工具。 1. JSON到Java对象 Jackson的核心API包括`ObjectMapper`,它是进行类型转换的主要类。你可以使用`readValue()`方法将...

    Jackson 框架,轻易转换JSON

    - **XML与JSON互转**:Jackson还支持XML与JSON之间的转换,通过`jackson-dataformat-xml`模块实现。 - **流式处理**:对于处理大量数据时,Jackson提供了流式API,可以有效减少内存消耗。 - **类型安全的POJO操作*...

    Struts2+hibernate3+JQuery+ajax+json三级联动

    在Struts2中,可以通过Json插件将Java对象转换为Json格式,然后发送给前端。JQuery可以方便地解析这个Json响应,更新页面元素。 至于"Test3List"这个文件,可能是测试用例或者表示三级联动中每一级的数据列表。这...

    struts2 json传输对象文档+jar包

    "json-lib-2.4-ALL.rar"是一个包含JSON库的压缩文件,JSON Lib是一个Java库,用于在Java对象和JSON数据之间进行转换,它是Struts2实现JSON支持的一个依赖库。 在Struts2中使用JSON,首先需要在配置文件(struts.xml...

    extjs+struts2+hibernate+json登录程序

    5. 验证结果返回给Struts2,Struts2将其转换为JSON格式的响应。 6. ExtJS接收到响应,解析JSON数据,根据返回状态更新UI,如显示登录成功或错误信息。 这个登录程序示例涵盖了Web开发中前端与后端的典型交互方式,...

    ssh中将含有级联对象的list转化为json

    在处理数据展示时,我们可能需要将后端Java对象转换为JSON格式,以便于前端EasyUI进行渲染和操作。本文将详细探讨如何在SSH框架中将含有级联对象或集合的List转化为JSON。 首先,了解JSON(JavaScript Object ...

    json实例编程应用

    它们各自负责不同的职责:Struts2.0主要处理MVC(Model-View-Controller)架构中的视图和控制层,Spring是一个全面的后端解决方案,包括依赖注入、事务管理、AOP等,而Hibernate则是一个优秀的对象关系映射(ORM)...

    json.libjar包

    4. 转换回Java对象:使用`JSONObject.toBean()`或`JSONArray.toList()`方法将JSON转换回Java对象。 5. 输出JSON字符串:调用`toString()`方法将JSON对象转换为字符串,方便打印或传输。 在实际应用中,`json-lib`常...

    将list转换为json失败的原因

    需要注意的是,如果在进行List的JSON转换时遇到问题,需要检查List中的每一个对象的类定义,确保所有不需要参与序列化的字段都被正确地注解了@JsonIgnore。否则,即使是List中的单个对象序列化错误也会导致整个List...

    JSON jar包

    它能够将Java集合、JDBC结果集、JavaBean、POJO等对象转换为JSON格式,同时也可以将JSON文本转换回Java对象。json-lib支持多种流行的数据模型,如Apache Commons BeanUtils、Google Guava、Hibernate等。 在Java...

    json对象封装及解析所需的JAR包

    `json-lib-2.4-jdk15.jar`是Json-lib库的一个版本,它是一个Java API,提供了将Java对象转换为JSON格式和从JSON反序列化回Java对象的功能。Json-lib支持多种Java类库,包括Hibernate、JavaBeans、JDOM、Jakarta ...

    sturts框架下返回json数据 list map 对象

    4. **返回JSON数据**:在Action的方法执行完毕后,由于配置了`json`结果类型,Struts2会自动将Action的属性转换为JSON格式并返回给客户端。如果需要自定义JSON输出,可以通过`@ResultType`注解指定特定的JSON结果...

Global site tag (gtag.js) - Google Analytics