JSON/Json-libを使う/JSONからJavaへいろんな変換
以下のような親子モデルで、ネストしたオブジェクトが正しく変換されるか、配列や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(); } }
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を追加しました。
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.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?が例外になっちゃいました。
配列も同じですね。ダメですねぇ。
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?になっちゃいましたが、一応正常終了ですね。
この記事は
現在のアクセス:49505