[[JSON/Json-libを使う/JSONからJavaへいろんな変換]]

// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。

#contents

以下のような親子モデルで、ネストしたオブジェクトが正しく変換されるか、配列やListやSetなどが正しく変換されるか試してみます。

 public class Parent {
   private String name;
   private int id;
   private Child child;
   public Child getChild() { return child; }
   public void setChild(Child child) { this.child = child;}
   public int getId() { return id;}
   public void setId(int id) { this.id = id;}
   public String getName() { return name;}
   public void setName(String name) { this.name = name;}
   public String toString() {
     return new ToStringBuilder(this).
         append("id", getId()).append("name",
         getName()).append("child", getChild()).toString();
   }
 }

 public class Child {
   private String name;
   public String getName() { return name;}
   public void setName(String name) { this.name = name;}
   public String toString() {
     return new ToStringBuilder(this)
            .append("name", getName()).toString();
   }
 }

***ネストしたオブジェクト [#j4880f41]
 Parent parent = new Parent();
 parent.setId(0);
 parent.setName("親の名前");
 
 Child child = new Child();
 child.setName("子の名前");
 parent.setChild(child);
 
 JSONObject jsonObject = JSONObject.fromObject(parent);
 System.out.println(jsonObject);
 
 Parent p = (Parent) JSONObject.toBean(jsonObject, Parent.class);
 System.out.println(p);
結果
 {"child":{"name":"子の名前"},"name":"親の名前","id":0}
 Parent@6e70c7[id=0,name=親の名前,child=Child@1d63e39[name=子の名前]]

うまくいきました。



***java.util.List [#we6c4678]
java.util.Listを追加しました。
 public class Parent {
   private String name;
   private int id;
 
   private List list; //追加
   public List getList() {return list;} //追加
   public void setList(List list) {this.list = list;} //追加
 
   //private Child child;
   //public Child getChild() { return child; }
   //public void setChild(Child child) { this.child = child;}
   public int getId() { return id;}
   public void setId(int id) { this.id = id;}
   public String getName() { return name;}
   public void setName(String name) { this.name = name;}
   public String toString() {
     return new ToStringBuilder(this).append("id", getId())
                .append("name",getName())
                .append("list", list).toString();
   }
 }
これでやってみると、、

 Parent parent = new Parent();
 parent.setId(0);
 parent.setName("親の名前");
 
 Child child = new Child();
 child.setName("子の名前");
 List<Child> list = new ArrayList<Child>();
 list.add(child);
 parent.setList(list);
 
 JSONObject jsonObject = JSONObject.fromObject(parent);
 System.out.println(jsonObject);
 
 Parent p = (Parent) JSONObject.toBean(jsonObject, Parent.class);
 System.out.println(p);
結果
 {"list":[{"name":"子の名前"}],"name":"親の名前","id":0}
 Parent@12a1e44[id=0,name=親の名前,list=[net.sf.json.util.JSONDynaBean@1ad77a7[
   {name=子の名前}
 ]]]
ChildをListに追加しているのですが、逆変換したオブジェクトはChildではなくnet.sf.json.util.JSONDynaBean になっちゃいました。まあ
 "list":[{"name":"子の名前"}]
とParentクラスだけだと、Listの中身がChildだって情報がないから、当たり前ですね。。


***java.util.Set [#a5717541]
java.util.Listをjava.util.Setに変えてみました。
 public class Parent {
   private String name;
   private int id;
   private Set children;
   
   public Set getChildren() {return children;}
   public void setChildren(Set children) {this.children = children;}
   public int getId() { return id;}
   public void setId(int id) { this.id = id;}
   public String getName() { return name;}
   public void setName(String name) { this.name = name;}
   public String toString() {
     return new ToStringBuilder(this).append("id", getId())
                .append("name",getName())
                .append("children", children).toString();
   }
 }

これでやってみると、、
 Parent parent = new Parent();
 parent.setId(0);
 parent.setName("親の名前");
 
 Child child = new Child();
 child.setName("子の名前");
 Set<Child> children = new HashSet<Child>();
 children.add(child);
 parent.setChildren(children);
 
 JSONObject jsonObject = JSONObject.fromObject(parent);
 System.out.println(jsonObject);
 
 Parent p = (Parent) JSONObject.toBean(jsonObject, Parent.class);
 System.out.println(p);
結果
 2006/12/31 18:01:40 org.apache.commons.beanutils.PropertyUtilsBean invokeMethod
 致命的: Method invocation failed.
 java.lang.IllegalArgumentException: argument type mismatch
BeanUtilsが例外になっちゃいました。


***配列 [#m3694282]
配列も同じですね。ダメですねぇ。


***java.util.Map [#ge97d174]
java.util.Setをjava.util.Mapに変えてみました。
 public class Parent {
   private String name;
   private int id;
   private Map children;
   
   public Map getChildren() {return children;}
   public void setChildren(Map children) {this.children = children;}
   public int getId() { return id;}
   public void setId(int id) { this.id = id;}
   public String getName() { return name;}
   public void setName(String name) { this.name = name;}
   public String toString() {
     return new ToStringBuilder(this).append("id", getId())
                .append("name",getName())
                .append("children", children).toString();
   }
 }

これでやってみると、、
 Parent parent = new Parent();
 parent.setId(0);
 parent.setName("親の名前");
 
 Child child = new Child();
 child.setName("子の名前");
 Map children = new HashMap();
 children.put("child1", child);
 parent.setChildren(children);
 
 JSONObject jsonObject = JSONObject.fromObject(parent);
 System.out.println(jsonObject);
 
 Parent p = (Parent) JSONObject.toBean(jsonObject, Parent.class);
 System.out.println(p);
結果
 {"name":"親の名前","id":0,"children":{"child1":{"name":"子の名前"}}}
 Parent@b1b4c3[id=0,name=親の名前,children={child1=net.sf.json.util.JSONDynaBean@1efb836[
   {name=子の名前}
 ]}]
例によってkey=child1とともに代入されたChildはnet.sf.json.util.JSONDynaBeanになっちゃいましたが、一応正常終了ですね。





----
この記事は
#vote(おもしろかった,そうでもない)
-やり方が悪いような気がするなあ。。でも時間切れ。。。 -- [[きの]] &new{2006-12-31 23:10:37 (日)};

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS