// 下階層用テンプレート #topicpath ---- //ここにコンテンツを記述します。 #contents [[Json-lib>http://json-lib.sourceforge.net/]] はJavaでJSON形式を取り扱うためのライブラリです。Javaオブジェクト<->JSON形式の表現の相互変換を行うことができます。 **インストール [#f3d0cc89] 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>http://ezmorph.sourceforge.net/]] 0.9.2 -[[xom>http://www.ibiblio.org/xml/XOM/]] 1.1 -junit 3.8.1(オプション) -oro 2.0.8(オプション) などです。 **いろいろなJavaオブジェクトをJSON形式で出力してみる [#f321f685] Json-libを使っていろいろなJavaオブジェクトをJSON形式で出力してみました。 ***配列を出力してみる [#nf5f11f2] boolean[] boolArray = new boolean[] { true, false, true }; JSONArray jsonArray = JSONArray.fromObject(boolArray); System.out.println(jsonArray); 結果 [true,false,true] キーを持たない配列はこのように記述するんですね。 ***リストを出力してみる [#b60539bc] List list = new ArrayList(); list.add("first"); list.add("second"); JSONArray jsonArray = JSONArray.fromObject(list); System.out.println(jsonArray); 結果 ["first","second"] 配列と同じですね。当たり前ですが。 ***Mapを出力してみる [#hbd9392e] 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オブジェクトを出力してみる [#m889771d] 対象のJavaのモデルはUser,Customerという[[Hibernate/マッピング定義について>Hibernate/マッピング定義について#j4e88693]]で書いたモデルを使用します。 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オブジェクトを生成する [#xd03107f] いままでは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インスタンスを作成しています。 ***JSON形式のオブジェクトから、Javaオブジェクトを復元する [#l6ffc132] 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); メソッドでインスタンスを取得することができます。 **コンテンツ一覧 [#qad9c132] #ls2 ---- この記事は #vote(おもしろかった[19],そうでもない[3]) -はじめ char[]で例外となり、プリミティブの配列はサポートされない?と思ったのですが、ダウンロードしたcommons-langが古いだけでした。最新版はOKでしたね -- [[きの]] &new{2006-12-30 18:36:36 (土)}; #comment #topicpath SIZE(10){現在のアクセス:&counter;}