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 );