[[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;}