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

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

以下のような親子モデルで、ネストしたオブジェクトが正しく変換されるか、配列や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

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

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.Map

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?になっちゃいましたが、一応正常終了ですね。


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

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

現在のアクセス:49505


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