json hibernate中級オブジェクト遅延ロード問題net.sf.json.JSONException: org....

3468 ワード

json hibernate中級オブジェクト遅延ロード問題net.sf.json.JSONException: org....
hibernateはCGLIBを使用してPOJOのdomainオブジェクトを動的にエージェントし、その魔法を実現するが、JSONのシーケンス化に迷惑をかける.JSONはlazyの属性をシーケンス化できないからだ.hibernateのシーケンス化問題を解決するには、次の4つの方法があります.
  • 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.第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