Top / JSON / Json-libを使う

Json-lib はJavaでJSON形式を取り扱うためのライブラリです。Javaオブジェクト<->JSON形式の表現の相互変換を行うことができます。

インストール

https://sourceforge.net/project/showfiles.php?group_id=171425よりバイナリをダウンロードできます。また依存ライブラリはhttp://json-lib.sourceforge.net/dependencies.html にあるとおり

  • commons-beanutils 1.7.0
  • commons-lang 2.2
  • ezmorph 0.9.2
  • xom 1.1
  • junit 3.8.1(オプション)
  • oro 2.0.8(オプション)

などです。

いろいろなJavaオブジェクトをJSON形式で出力してみる

Json-libを使っていろいろなJavaオブジェクトをJSON形式で出力してみました。

配列を出力してみる

boolean[] boolArray = new boolean[] { true, false, true };
JSONArray jsonArray = JSONArray.fromObject(boolArray);
System.out.println(jsonArray);

結果

[true,false,true]

キーを持たない配列はこのように記述するんですね。

リストを出力してみる

 List list = new ArrayList();
 list.add("first");
 list.add("second");
 JSONArray jsonArray = JSONArray.fromObject(list);
 System.out.println(jsonArray);

結果

["first","second"]

配列と同じですね。当たり前ですが。

Mapを出力してみる

Map map = new HashMap();
map.put("name", "json");
map.put("bool", Boolean.TRUE);
map.put("int", new Integer(1));
map.put("arr", new String[] { "a", "b" });
map.put("chars", new char[] { 'a', 'b' });

結果

{"chars":["a","b"],"arr":["a","b"],"int":1,"name":"json","bool":true}

記述がネスト化されていまて、さらに{"key":"value"}という構造になっています。だんだんJavaのオブジェクト表現に近くなってきました。

Javaオブジェクトを出力してみる

対象のJavaのモデルはUser,CustomerというHibernate/マッピング定義についてで書いたモデルを使用します。

User user = new User();
user.setName("ユーザ1");
user.setAddress("東京都江東区");

Customer c1 = new Customer();
c1.setName("顧客1");
Customer c2 = new Customer();
c2.setName("顧客2");

Set<Customer> set = new HashSet<Customer>();
set.add(c1);
set.add(c2);
user.setCustomers(set);

JSONObject jsonObject = JSONObject.fromObject(user);
System.out.println(jsonObject);

結果

{ "customers":[
    {"user":null,"name":"顧客1","id":0},
    {"user":null,"name":"顧客2","id":0}
  ],
  "address":"東京都江東区",
  "name":"ユーザ1",
  "id":0
}  (整形してます)

Setを使ったモデル内のモデルSetも、ネスト構造を用いてうまく表現されていますね。

JSON形式の文字列からJSONオブジェクトを生成する

いままではJavaオブジェクトからJSONObjectのインスタンスを作成しました。もちろんJSON形式の文字列からJSONObjectのインスタンスを作成することもできます。

jsonObject = JSONObject
 .fromString("{\"customers\":[{\"user\":null,\"name\":\"顧客1\",\"id\":0},
              {\"user\":null,\"name\":\"顧客2\",\"id\":0}],
              \"address\":\"東京都江東区\",\"name\":
              \"ユーザ1\",\"id\":0}"); //ここは一行で。
System.out.println(jsonObject);

結果

{ "customers":[
    {"user":null,"name":"顧客1","id":0},
    {"user":null,"name":"顧客2","id":0}
  ],
  "address":"東京都江東区",
  "name":"ユーザ1",
  "id":0
}  (整形してます)

¥でエスケープしてるのでわかりにくいですがさっきのJavaモデルのJSON形式を引数に渡して、JSONObjectインスタンスを作成しています。

2009/03/18追記

久しぶりに触ってみたら、モジュールが色々バージョンアップしてるみたいですね。今触ってるのは、2.2.3なのですが、JSONObject#fromString はなくなってるようで、

JSONObject jsonObject = JSONObject.fromObject(json);

を使用するようです。

JSON形式のオブジェクトから、Javaオブジェクトを復元する

JavaオブジェクトからJSON形式に変換することはできましたが、逆にJSON形式の文字列からJavaオブジェクトを復元することもできます。対象のモデルを

public class BeanA {
  private boolean bool;
  private int integer;
  private String str;
  
  public boolean isBool() { return bool; }
  public int getInteger() { return integer; }
  public String getString() { return str; }
  public void setBool(boolean bool) { this.bool = bool; }
  public void setInteger(int integer) { this.integer = integer; }
  public void setString(String str){ this.str=str; }
}

とします。このクラスのインスタンスをJSON形式の文字列から取得するには以下のようにします。

String json = "{bool:true,integer:1,string:\"json\"}";<-JSON形式の文字列
JSONObject jsonObject = JSONObject.fromString(json);
System.out.println(jsonObject);
BeanA bean = (BeanA) JSONObject.toBean(jsonObject, BeanA.class); <-これ

System.out.println(bean.getInteger());
System.out.println(bean.getString());
System.out.println(bean.isBool());

結果

{"string":"json","integer":1,"bool":true}
1
json
true

このように

JSONObject.toBean([JSONObjectのインスタンス], [復元したいオブジェクト].class);

メソッドでインスタンスを取得することができます。

コンテンツ一覧


この記事は

選択肢 投票
おもしろかった 59  
そうでもない 14  
  • はじめ char[]で例外となり、プリミティブの配列はサポートされない?と思ったのですが、ダウンロードしたcommons-langが古いだけでした。最新版はOKでしたね -- きの? 2006-12-30 18:36:36 (土)

Top / JSON / Json-libを使う

現在のアクセス:81473


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-11-10 (木) 15:22:15 (257d)