`

Json-lib 与 hibernate _lazy共同使用的问题

阅读更多
原文http://ericyou.iteye.com/blog/325246
hibernate使用CGLIB把POJO的domain对象动态代理,实现它的魔法,但是给JSON的序列化带来了麻烦,因为JSON无法对lazy的属性进行序列化。有以下的四个方法可以解决hibernate的序列化问题
domain类实现JSONString接口

建立JsonConfig实例,并配置属性排除列表
用属性过滤器
写一个自定义的JsonBeanProcessor
1. 实现JSONString接口是侵入性最强的方法
public class Person implements JSONString {  
   private String name;  
   private String lastname;  
   private Address address;  
  
   // getters & setters  
  
   public String toJSONString() {  
      return "{name:'"+name+"',lastname:'"+lastname+"'}";  
   }  
} 


2.第二种方法通过jsonconfig实例,对包含和需要排除的属性进行方便添加删除
public class Person {  
   private String name;  
   private String lastname;  
   private Address address;  
  
   // getters & setters  
}  
  
JsonConfig jsonConfig = new JsonConfig();  
jsonConfig.setExclusions( new String[]{ "address" } );  
Person bean = /* initialize */;  
JSON json = JSONSerializer.toJSON( bean, jsonConfig );  


注意:这种方法不区分目标类,就是说如果有2个bean当中都存在“address”属性,那么采用这种方法,这两个bean中的address属性都将被排除
3. 使用propertyFilter可以允许同时对需要排除的属性和类进行控制,这种控制还可以是双向的,也可以应用到json字符串到java对象
public class Person {  
   private String name;  
   private String lastname;  
   private Address address;  
  
   // getters & setters  
}  
  
JsonConfig jsonConfig = new JsonConfig();  
jsonConfig.setJsonPropertyFilter( new PropertyFilter(){  
   public boolean apply( Object source, String name, Object value ){  
      // return true to skip name  
      return source instanceof Person && name.equals("address");  
   }  
});  
Person bean = /* initialize */;  
JSON json = JSONSerializer.toJSON( bean, jsonConfig ) 


4. 最后来看JsonBeanProcessor,这种方式和实现JsonString很类似,返回一个代表原来的domain类的合法JSONOBJECT
public class Person {  
   private String name;  
   private String lastname;  
   private Address address;  
  
   // getters & setters  
}  
  
JsonConfig jsonConfig = new JsonConfig();  
jsonConfig.registerJsonBeanProcessor( Person.class,  
   new JsonBeanProcessor(){  
      public JSONObject processBean( Object bean, JsonConfig jsonConfig ){  
         if( !(bean instanceof Person) ){  
            return new JSONObject(true);  
         }  
         Person person = (Person) bean;  
         return new JSONObject()  
            .element( "name", person.getName() )  
            .element( "lastname", person.getLastname() );  
      }  
});  
Person bean = /* initialize */;  
JSON json = JSONSerializer.toJSON( bean, jsonConfig );  


And it is here with JsonBeanProcessors where we encounter the second gotcha related to CGlib. As you noticed we registered the processor using Person as target class, but Hibernate returns a Proxy that is not exactly a Person but a subclass (if possible) of Person. The default matching algorithm used by Json-lib will try to match the exact class (using equals), meaning that your processor will not be called when you expect it to be,this is why JsonBeanProcessorMatcher was introduced, now you are be able to write the following code
<textarea class="java:nocontrols:nogutter" cols="80" rows="34" name="srccode">public class Person { private String name; private String lastname; private Address address; // getters & setters } JsonConfig jsonConfig = new JsonConfig(); jsonConfig.registerJsonBeanProcessor( Person.class, new JsonBeanProcessor(){ public JSONObject processBean( Object bean, JsonConfig jsonConfig ){ if( !(bean instanceof Person) ){ return new JSONObject(true); } Person person = (Person) bean; return new JSONObject() .element( "name", person.getName() ) .element( "lastname", person.getLastname() ); } }); jsonConfig.registerJsonBeanProcessorMatcher( new JsonBeanProcessorMatcher(){ public Object getMatch( Class target, Set/*<Class>*/ matches ){ for( Object match : matches ){ if( ((Class)match).isAssignableFrom(target) ){ return match; } } return null; } }); Person bean = /* initialize */; JSON json = JSONSerializer.toJSON( bean, jsonConfig );</textarea>
I hope these examples help dispel some doubts, in any case please feel free to drop by Json-lib's forum and mailing lists.
分享到:
评论

相关推荐

    lazy-snapping--master.zip_lazy-snapping

    描述提到“基于lazy-snapping的图片分割代码”,这表明这个压缩包包含的是一个用于图像处理,特别是图像分割的软件或算法的实现,它使用了“lazy-snapping”策略。 “lazy-snapping”是一种在图像处理中用于图像...

    json-lib所需全部jar文件

    1. **commons-collections-3.1.jar**:Apache Commons Collections是Java集合框架的扩展,提供了许多额外的数据结构和操作,如bag、matrix、lazy collections、combinators等,对于`json-lib`来说,这可能用于增强...

    Hibernate之第3解之-hibernate_hibernate_many2one_1

    使用JOIN查询或子查询可以在一定程度上解决这个问题。 7. **缓存机制**: Hibernate的二级缓存可以帮助提高性能,尤其是在处理关联关系时。通过配置缓存策略,可以在内存中存储关联对象,减少对数据库的访问。 综...

    lazy_object_proxy-1.6.0-cp37-cp37m-win_amd64

    lazy_object_proxy-1.6.0-cp37-cp37m-win_amd64

    Python库 | lazy_object_proxy-0.1.0-cp33-none-win_amd64.whl

    python库。 资源全名:lazy_object_proxy-0.1.0-cp33-none-win_amd64.whl

    lazy_object_proxy-1.6.0-cp38-cp38-win_amd64

    lazy_object_proxy-1.6.0-cp38-cp38-win_amd64

    lazy_object_proxy-1.4.3-cp27-cp27m-win_amd64

    lazy_object_proxy-1.4.3-cp27-cp27m-win_amd64

    jQuery_lazyload

    jQuery_lazyload是一个非常实用的JavaScript库,用于优化网页性能,特别是在处理大量图片或者内容时。这个插件的主要目的是延迟加载,即在用户滚动到页面的特定部分时才加载那些可视区域以外的内容,从而减少初次...

    Python库 | py_polars-0.0.24-cp38-cp38-macosx_10_7_x86_64.whl

    **安装与使用** 在Python环境中,你可以通过pip来安装这个`.whl`文件: ```bash pip install path/to/py_polars-0.0.24-cp38-cp38-macosx_10_7_x86_64.whl ``` 确保你的Python环境是3.8版本,并且操作系统为兼容的...

    pcre-devel-8.31-3.1.x86_64.rpm

    pcre linux的安装文件 rpm 文件,非常有用!

    Hibernate_3.2.0_Reference_zh_CN.rar hibernate中文api

    14. **延迟加载(Lazy Loading)**:Hibernate的懒加载机制能提高性能,只在真正需要时加载关联对象,避免了内存浪费。 15. **缓存机制**:Hibernate提供了第一级缓存(Session级别的缓存)和第二级缓存...

    hibernate_reference

    - **Fetch Strategies:** 控制Hibernate加载关联对象的方式,如eager(急切加载)和lazy(延迟加载)。 - **Batch Processing:** 通过批量处理减少与数据库的交互次数,提高效率。 - **Second-Level Cache:** ...

    Node.js-一个组件实现lazyload图片当在视窗内(或附近)时才加载

    `react-lazy-image-master`这个压缩包文件很可能是包含了一个实现懒加载图片功能的React组件示例。通常,这样的组件会依赖于Intersection Observer API,这是一个浏览器原生API,用于检测元素是否进入或离开视口。...

    Python库 | pytest_lazy_fixture-0.5.1-py3-none-any.whl

    资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:pytest_lazy_fixture-0.5.1-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    jquery_lazyload-master.zip

    jquery_lazyload-master.zip 类似新浪微博 的图片懒加载,非常实用jquery_lazyload-master.zip 类似新浪微博 的图片懒加载,非常实用jquery_lazyload-master.zip 类似新浪微博 的图片懒加载,非常实用jquery_lazy...

    Laravel开发-json-reducer

    为了进一步优化,`json-reducer`可能会实现懒加载(lazy loading)策略。在默认情况下,Laravel会加载模型的所有关联数据,但如果数据量大,这可能导致内存问题。通过懒加载,只有在需要时才会获取关联数据,显著...

    lazy_object_proxy-1.7.1-pp38-pypy38_pp73-win_amd64.whl

    lazy_object_proxy-1.7.1-pp38-pypy38_pp73-win_amd64.whl

    lazy_object_proxy-1.6.0-cp310-cp310-win_amd64

    lazy_object_proxy-1.6.0-cp310-cp310-win_amd64

    hibernate-min-lib.rar

    "hibernate-min-lib.rar" 提供了一个精简版的Hibernate库,包含了学习和开发过程中最基本、最核心的功能,足以满足初学者对Hibernate框架的理解与实践需求。 一、Hibernate概述 Hibernate 是一款开源的Java ORM框架...

Global site tag (gtag.js) - Google Analytics