JSON-libの概要
JSON-libは、
JDK1.
実際の処理では、
JSON-libの実行に必要なライブラリ
- EZMorph (http://
ezmorph. sourceforge. net/) - Jakarta Commons BeanUtils (http://
jakarta. apache. org/ commons/ beanutils/) - Jakarta Commons Lang (http://
jakarta. apache. org/ commons/ lang/) - Jakarta Commons Logging (http://
jakarta. apache. org/ commons/ logging/) - Jakarta ORO (http://
jakarta. apache. org/ oro/) - JUnit (http://
junit. org/) - XOM (http://
xom. nu/)
JSONの概要
JSON-libを紹介する前に、
Web APIで採用されるJSON
JSON(JavaScript Object Notation)とは、
JSON形式で処理結果を返すWeb APIの例
- ●国内サイト
- ●海外サイト
JSON形式によるオブジェクトの定義
Ajaxの広がりに伴い公開されるようになったWeb APIは、
たとえば、
data = { "id" : 1, "title" : "東京ミッドタウン", "filename" : "midtown01.JPG" };
1つのオブジェクト定義は{}で囲み、
1つのオブジェクト定義を, (カンマ)で区切り、
data = [
{ "id" : 1, "title" : "東京ミッドタウン", "filename" : "midtown01.JPG" },
{ "id" : 2, "title":"新丸ビル", "filename" : "shinmaru01.JPG" }
];
JSONには関数の定義を含めることもできます。以下のcalcオブジェクトには、
calc = {
"plus" : function(a, b) { return a + b; },
"minus" : function(a, b) { return a - b; }
};
JSON形式の文字列からオブジェクトを生成する場合は、
json = '{ "id" : 1, "title" : "東京ミッドタウン" }';
data = eval( '(' + json + ')' );
alert( '画像ID = ' + data.id + ', タイトル = ' + data.title );
JSON-libによるJSON文字列の生成
それでは、
シンプルなオブジェクト定義の生成(JSONObject)
はじめに、
// JSON文字列の生成(シンプルなオブジェクト定義)
JSONObject obj = new JSONObject();
// プロパティを登録
obj.put( "id", 1 );
obj.put( "title", "東京ミッドタウン" );
// JSON文字列を生成
System.out.println( obj.toString() );
実行結果
{"id":1,"title":"東京ミッドタウン"}
JavaBeanからの生成(JSONObject)
Ajaxアプリケーションでは、
DataBean bean = new DataBean( 1, "東京ミッドタウン" );
// JavaBeanからJSON文字列を生成
JSONObject obj = JSONObject.fromBean( bean );
System.out.println( obj.toString() );
// プロパティが格納されるJavaBeanクラス
public class DataBean {
private int id;
private String title;
public DataBean( int id, String title ) {
this.id = id;
this.title = title;
}
/***** セッター/ゲッターメソッド *****/
}
配列やコレクションからの生成(JSONArray)
JavaBeanが配列になっている場合はfromObject()メソッド、
// 配列からJSON文字列を生成
DataBean db1 = new DataBean( 1, "東京ミッドタウン" );
DataBean db2 = new DataBean( 2, "新丸ビル" );
DataBean[] data = new DataBean[] { db1, db2 };
JSONArray array = JSONArray.fromObject( data );
// コレクションからJSON文字列を生成
ArrayList list = new ArrayList();
list.add( new DataBean( 1, "東京ミッドタウン" ) );
list.add( new DataBean( 2, "新丸ビル" ) );
JSONArray array = JSONArray.fromCollection( list );
関数が設定されるプロパティの場合は? (JSONFunction)
プロパティに関数を設定する場合は、
// 関数を設定するJSON文字列を生成
JSONFunction plus = new JSONFunction( new String[] { "a", "b" }, "return a + b;" );
String minus = "function minus(a,b) { return a - b; }";
JSONObject obj = new JSONObject();
obj.put( "plus", plus );
obj.put( "minus", minus );
System.out.println( obj.toString() );
実行結果
{"plus":function(a,b){ return a + b; }, "minus":"function minus(a,b) { return a - b; }"}
JSON文字列からJavaオブジェクトの生成
JavaScriptからサーバ側にデータを送信する際、
ちなみに、
JSON文字列が単独のオブジェクトを表す場合はJSONObjectクラスのtoBean()メソッド、
JSONのオブジェクト定義からJavaオブジェクトの生成(JSONObject)
// オブジェクト定義からJavaBeanを生成
String json = JavaScriptから取得したオブジェクト定義のJSON文字列;
JSONObject obj = new JSONObject( json );
DataBean bean = (DataBean)JSONObject.toBean( obj, DataBean.class );
System.out.println( bean.toString() );
JSONの配列からJava配列(Object[])の生成(JSONArray)
// 配列定義からJava配列(要素はDataBeanクラス)を生成
String json = JavaScriptから取得した配列定義のJSON文字列;
JSONArray obj = new JSONArray( json );
Object[] data = JSONArray.toArray( obj, DataBean.class );
// 配列定義からリストを生成する場合はtoList()メソッドを実行
List list = JSONArray.toList( obj, DataBean.class );
for( Object o : data ) System.out.println( (DataBean)o );
JSON文字列の送受信のポイント(JavaScript-サーバサイド間)
JSON-libによって、
a) 文字コードはUTF-8とする
JSON文字列の送受信はUTF-8で行うようにします。ブラウザによっては、
// JSON文字列をサーバサイドから受信(JavaScript)
var req = XMLHttpRequestオブジェクト;
req.onreadystatechange = function() {
data = eval( '(' + req.responseText + ')' );
// json.jsを利用する場合
// data = req.responseText.parseJSON();
}
// JSON文字列をXMLHttpRequestに送信する(サーバサイド)
response.setContentType( "application/json; charset=UTF-8" );
out.print( JSON文字列 ); // JSON文字列はUTF-8に変換済みとする
out.close();
// JSON文字列を受信してJavaオブジェクトに変換(サーバサイド)
String json = request.getParameter( "data" );
if ( json != null ) {
json = new String( json.getBytes( "ISO-8859-1" ), "UTF-8" );
JSONObject obj = JSONObject.fromString( json );
DataBean data = (DataBean)JSONObject.toBean( obj, DataBean.class );
}
b) 悪意のあるJavaScriptコードをWebブラウザに送信される可能性がある
JavaScriptで受信したJSON文字列はeval関数によって解釈し、
前述のjson.
JSON-libは小さなライブラリですが、