json hibernate中級オブジェクト遅延ロード問題net.sf.json.JSONException: org....
3468 ワード
json hibernate中級オブジェクト遅延ロード問題net.sf.json.JSONException: org....
hibernateはCGLIBを使用してPOJOのdomainオブジェクトを動的にエージェントし、その魔法を実現するが、JSONのシーケンス化に迷惑をかける.JSONはlazyの属性をシーケンス化できないからだ.hibernateのシーケンス化問題を解決するには、次の4つの方法があります. JsonConfigインスタンスを確立し、属性除外リスト を構成する カスタムJsonBeanProcessor を書く
1.JSOnStringインタフェースを実現することは最も侵入性の強い方法である
2.第2の方法は、jsonconfigインスタンスを使用して、除外する属性と除外する属性を簡単に追加削除することです.
注意:この方法ではターゲットクラスを区別しません.つまり、2つのbeanに「address」属性が存在する場合、この方法では、2つのbeanのaddress属性が除外されます.
3.propertyFilterを使用すると、除外する属性とクラスを同時に制御できます.この制御は双方向でもjavaオブジェクトにjson文字列を適用することもできます.
4.最後にJsonBeanProcessorを見てみましょう.この方法はJsonStringを実現するのと似ています.元のdomainクラスを表す合法的なJSONOBJECTを返します.
hibernateはCGLIBを使用してPOJOのdomainオブジェクトを動的にエージェントし、その魔法を実現するが、JSONのシーケンス化に迷惑をかける.JSONはlazyの属性をシーケンス化できないからだ.hibernateのシーケンス化問題を解決するには、次の4つの方法があります.
domain JSONString
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.第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」属性が存在する場合、この方法では、2つのbeanのaddress属性が除外されます.
3.propertyFilterを使用すると、除外する属性とクラスを同時に制御できます.この制御は双方向でもjavaオブジェクトにjson文字列を適用することもできます.
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 );
from:http://hewiser.javaeye.com/category/87722?show_full=true