`

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

阅读更多
Posted by: Andres Almiray on 05/01/2008 原文

hibernate使用CGLIB把POJO的domain对象动态代理,实现它的魔法,但是给JSON的序列化带来了麻烦,因为JSON无法对lazy的属性进行序列化。有以下的四个方法可以解决hibernate的序列化问题

  1. domain类实现JSONString接口
  2. 建立JsonConfig实例,并配置属性排除列表
  3. 用属性过滤器
  4. 写一个自定义的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.

分享到:
评论
9 楼 a754782339 2015-04-05  
楼主你好,我现在遇到的问题就是json与hibernate使用的时候hibernate配置级联之后json无法将list转换为json串,您上边写的我不是神清楚,能加一下您的联系方式
么, 给我细讲一下!扣扣754782339!我想用fastjson。jar,如果实在不行我就用.net的那个json   拜托了
8 楼 nbkangta 2012-09-12  
dampce032 写道
如果我想取到Person下Address下的某个属性的值怎么办

你可以在tojson之前访问下这个Person的Address,加载Address
7 楼 dampce032 2012-09-07  
如果我想取到Person下Address下的某个属性的值怎么办
6 楼 nbkangta 2012-08-16  
zblfendou 写道
请问在实体中设置了hibernate映射关系可不可以在setExclusions方法中设置
dept.deptName呢?
实体User中 @JoinColumn(name = "dept_id")
  private Dept dept;
我能不能这样过滤掉dept中的属性呢?


你好,这是可以的,可能记得不是很清楚了,你可是试试@transparent
5 楼 zblfendou 2012-08-12  
请问在实体中设置了hibernate映射关系可不可以在setExclusions方法中设置
dept.deptName呢?
实体User中 @JoinColumn(name = "dept_id")
  private Dept dept;
我能不能这样过滤掉dept中的属性呢?
4 楼 nbkangta 2009-03-23  
javalog 写道

请问请2种办法试过么?我想排除指定的属性,却还是会出错,代码因该是这样写吧?
JsonConfig jsonConfig = new JsonConfig();&nbsp;&nbsp;
jsonConfig.setExcludes(new String[]{ "company","dept","job","roles","Privileges","privilegeIds"} );&nbsp;&nbsp;
JSON json = JSONSerializer.toJSON( u, jsonConfig );

这些都是没问题的,主要的目的是跳过使用hibernate代理的未初始化的Lazy Load属性
另外其实还有重方法,就是使用支持hibernate的 beanutil
3 楼 nbkangta 2009-03-23  
javalog 写道

Property 'delegate' has no getter method。还是这一种错。第三种试了也不行

你的POJO里面应该还有使用hibernate代理的属性吧,比如PersisteneSet这些
2 楼 javalog 2009-03-21  
Property 'delegate' has no getter method。还是这一种错。第三种试了也不行
1 楼 javalog 2009-03-21  
请问请2种办法试过么?我想排除指定的属性,却还是会出错,代码因该是这样写吧?
JsonConfig jsonConfig = new JsonConfig();  
jsonConfig.setExcludes(new String[]{ "company","dept","job","roles","Privileges","privilegeIds"} );  
JSON json = JSONSerializer.toJSON( u, jsonConfig );

相关推荐

    json-lib-2.3-jdk15基础jar包合辑

    - **数据存储**:在持久化框架如Hibernate中,JSON Lib可以用于将Java对象转换成JSON字符串,方便存储到数据库的JSON字段。 - **前端交互**:后端开发中,通过JSON格式与前端JavaScript进行数据交互,JSON Lib简化了...

    ezmorph-1.0.6.jar和json-lib-2.2.2-jdk15.rar

    - **版本与JDK兼容性**:"json-lib-2.2.2-jdk15"表明这个版本的json-lib是针对JDK 1.5编译的,这意味着它可以运行在支持JDK 1.5及更高版本的Java环境中。 - **功能**:json-lib提供了一系列的API,可以将Java对象...

    json-lib-2.4的jar包.zip

    3. **XML与JSON之间的转换**:`json-lib`还支持XML和JSON之间的互换,这对于需要在XML和JSON之间进行数据转换的应用程序特别有帮助。 4. **支持多种Java框架**:`json-lib`兼容多种Java框架,如Spring、Hibernate等...

    json-lib-2.3-jdk15.jar和它的源码包

    2. **与Hibernate集成**:json-lib可以方便地将Hibernate的实体对象转换为JSON,这对于开发基于RESTful API的Web应用非常有用。 3. **自定义转换策略**:可以通过实现`net.sf.json.JSONObject$BeanProcessor`接口...

    json-lib所需全部jar包

    例如,如果你的项目使用了Hibernate,那么可能还需要添加Hibernate的JSON支持,这可能涉及到额外的JAR文件。同时,为了保证项目的运行,还需要确保你的类路径中包含了所有必要的库。 对于日志处理,虽然commons-...

    json-lib-2.4-jdk15

    json-lib 与其他Java框架如Spring、Hibernate等有良好的集成,可以方便地在这些框架中处理JSON数据,提高开发效率。 5. **版本兼容性** "json-lib-2.4-jdk15" 版本特别强调了与JDK 1.5的兼容性,这意味着即使在较...

    json-lib-2.2.3-jdk15.jar有关文件

    6. **与其他技术集成**:`json-lib`可以方便地与Spring框架、Hibernate ORM等集成,进一步提升开发效率。 7. **依赖管理**:使用`json-lib-2.2.3-jdk15.jar`可能需要其他依赖项,这些依赖通常会包含在项目的类路径...

    json-lib-2.4-jdk15及其依赖jar包.rar

    6. **与其他技术集成**:`json-lib`可以与Spring框架、Hibernate等无缝集成,简化JSON与数据库或服务之间的交互。 在实际开发中,确保正确引入所有依赖的jar包,避免出现“ClassNotFoundException”或...

    json-2.2.3-jdk13全部包6个

    "json-lib"核心包包含了JSON解析、序列化和反序列化的基本功能,而其他五个依赖包可能是为了提供额外的支持,例如与其他数据格式(如XML、Hibernate对象等)之间的转换,或者提供更高效的解析和生成机制。...

    json-lib相关联的所有包

    5. 配合其他Java库:json-lib与许多其他Java库兼容,如Hibernate、Spring等。这使得在这些框架中使用JSON时,可以无缝集成json-lib进行数据序列化和反序列化。 6. 性能优化:虽然json-lib在性能上可能不如现代的...

    gson,fastJson,json-lib实例

    json-lib是一个针对多种Java类库的JSON处理器,包括Hibernate、Spring、EJB等。它的特点是兼容性好,可以方便地处理各种Java集合和自定义类型。然而,相比Gson和FastJson,json-lib的更新较慢,性能可能稍逊一筹。...

    json-lib-2.4

    7. **与其他库的兼容性**:JSON-Lib设计时考虑了与其他Java库的兼容性,例如它可以与Spring框架、Hibernate等无缝集成,方便在大型项目中使用。 8. **文档与社区支持**:JSON-Lib拥有详细的API文档和活跃的开发者...

    json-lib 导入所需要的6个jar 包

    - 使用json-lib时需注意版本兼容性,确保所使用的jar包版本与项目中其他依赖库匹配。 - 考虑性能因素,对于大量数据的转换,可能需要评估是否选用更高效的JSON库,如Jackson或Gson。 - 对于复杂的Java对象结构,可能...

    Json-lib的六个jar包

    总结来说,Json-lib的六个JAR包共同构成了一个强大的JSON处理工具集,涵盖了JSON与Java对象之间的相互转换、数据类型转换、集合操作以及日志记录等功能,极大地简化了Java开发者处理JSON数据的工作。在Web服务、...

    json-lib json工具包

    4. **与其他Java库的兼容性**:json-lib可以与其他流行Java库如Hibernate、Spring等无缝集成,方便开发人员在现有的项目中使用JSON功能。 5. **性能优化**:json-lib通过优化的算法和数据结构提高了JSON操作的性能...

    json-lib.rar 完整的,经测试了

    6. **社区支持**:作为一个成熟的开源项目,`json-lib`背后有一个活跃的开发社区,提供持续的更新和问题解决,用户可以在遇到问题时获得帮助。 在`json-lib.rar`压缩包中,包含的文件可能是`json-lib`的源码、编译...

    json-lib 所需jar包

    5. **与其他技术集成**:`json-lib`可以很好地与Spring框架、Hibernate等集成,方便在这些框架中处理JSON数据。 总的来说,`json-lib`作为一个强大的JSON处理库,提供了丰富的API供开发者使用。通过理解和掌握它的...

    json-lib方式的包

    4. **兼容性**:json-lib支持多种Java技术框架,如Hibernate、EJB3和JaxB,可以方便地在这些框架中使用JSON。 5. **性能优化**:json-lib经过优化,可以处理大规模数据,提高了数据转换的效率。 在使用json-lib时...

    json-lib及其关连的JAR

    6. **错误处理**:在转换过程中遇到问题时,JSON-lib会抛出相应的异常,帮助开发者调试和解决问题。 JAR(Java Archive)是Java平台的标准打包格式,用于收集多个类文件和相关的元数据到一个文件中,便于分发和部署...

    json-lib-2.4及其全部依赖jar包

    总的来说,`json-lib-2.4`是一个方便的Java库,用于处理JSON数据,它与多个版本的JDK兼容,并且已经包含了所有必要的依赖,使得集成和使用变得简单。对于那些需要在Java项目中进行JSON操作的开发者来说,这是一个...

Global site tag (gtag.js) - Google Analytics