json解決hibernate中級聯對象延遲加載有關問題

hibernate使用CGLIB把POJO的domain對象動態代理,實現它的魔法,但是給JSON的序列化帶來了麻煩,因爲JSON無法對lazy的屬性進行序列化。有以下的四個方法可以解決hibernate的序列化問題

  1. domain類實現JSONString接口
  2. 建立JsonConfig實例,並配置屬性排除列表
  3. 用屬性過濾器
  4. 寫一個自定義的JsonBeanProcessor

1. 實現JSONString接口是侵入性最強的方法

Java代碼  收藏代碼
  1. public class Person implements JSONString {  
  2.    private String name;  
  3.    private String lastname;  
  4.    private Address address;  
  5.    
  6.    // getters & setters  
  7.    
  8.    public String toJSONString() {  
  9.       return "{name:'"+name+"',lastname:'"+lastname+"'}";  
  10.    }  
  11. }  

 

 

2.第二種方法通過jsonconfig實例,對包含和需要排除的屬性進行方便添加刪除

Java代碼  收藏代碼
  1. public class Person {  
  2.    private String name;  
  3.    private String lastname;  
  4.    private Address address;  
  5.    
  6.    // getters & setters  
  7. }  
  8.    
  9. JsonConfig jsonConfig = new JsonConfig();  
  10. jsonConfig.setExclusions( new String[]{ "address" } );  
  11. Person bean = /* initialize */;  
  12. JSON json = JSONSerializer.toJSON( bean, jsonConfig );  

 

 

注意:這種方法不區分目標類,就是說如果有2個bean當中都存在“address”屬性,那麼採用這種方法,這兩個bean中的address屬性都將被排除

3. 使用propertyFilter可以允許同時對需要排除的屬性和類進行控制,這種控制還可以是雙向的,也可以應用到json字符串到java對象

 

Java代碼  收藏代碼
  1. public class Person {  
  2.    private String name;  
  3.    private String lastname;  
  4.    private Address address;  
  5.    
  6.    // getters & setters  
  7. }  
  8.    
  9. JsonConfig jsonConfig = new JsonConfig();  
  10. jsonConfig.setJsonPropertyFilter( new PropertyFilter(){  
  11.    public boolean apply( Object source, String name, Object value ){  
  12.       // return true to skip name  
  13.       return source instanceof Person && name.equals("address");  
  14.    }  
  15. });  
  16. Person bean = /* initialize */;  
  17. JSON json = JSONSerializer.toJSON( bean, jsonConfig )  

 

4. 最後來看JsonBeanProcessor,這種方式和實現JsonString很類似,返回一個代表原來的domain類的合法JSONOBJECT

Java代碼  收藏代碼
  1. public class Person {  
  2.    private String name;  
  3.    private String lastname;  
  4.    private Address address;  
  5.    
  6.    // getters & setters  
  7. }  
  8.    
  9. JsonConfig jsonConfig = new JsonConfig();  
  10. jsonConfig.registerJsonBeanProcessor( Person.class,  
  11.    new JsonBeanProcessor(){  
  12.       public JSONObject processBean( Object bean, JsonConfig jsonConfig ){  
  13.          if( !(bean instanceof Person) ){  
  14.             return new JSONObject(true);  
  15.          }  
  16.          Person person = (Person) bean;  
  17.          return new JSONObject()  
  18.             .element( "name", person.getName() )  
  19.             .element( "lastname", person.getLastname() );  
  20.       }  
  21. });  
  22. Person bean = /* initialize */;  
  23. JSON json = JSONSerializer.toJSON( bean, jsonConfig ); 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章