** JSON - JavaScript言語のサブセットとして定義された軽量のデータフォーマット [#wf8dd7b7]

#setlinebreak(on);

Ajaxなどでデータ通信を行う場合、XMLだと解析(parse)やjavaScriptオブジェクト(配列)への変換が必要だが、
JSONはJavaScriptのサブセットである為、Ajaxの戻り値として取得した文字列をevalするだけで、そのまま JavaScriptで使えてしまう。
また JSON-lib 等のデータ変換ライブラリの登場によって、さらに注目を集めている。

※JSON-lib ・・・ JavaBeans、MAP、コレクション、配列、XMLデータなどをJSONデータへ変換するためのJavaライブラリ。

◆AjaxでJSONデータを取得する例(JavaScript側)
 var ajax = false;
 
 // IE以外
 if(window.XMLHttpRequest) {
    ajax = new XMLHttpRequest();
 // IE用
 } else if(window.ActiveXObject) {
    try {
       ajax = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
       ajax = new ActiveXObject("Microsoft.XMLHTTP");
    }
 }
 
 ajax.open("POST",'xxxxxxxxxxxx.do');
 ajax.onreadystatechange = function() {
 	if (ajax.readyState == 4 && ajax.status == 200) {
 		var obj = document.getElementById(objID);
 		data = eval("(" + ajax.responseText + ")");
 		/* json.jsを利用する場合 */
 		// data = req.responseText.parseJSON();
 	}
 }
 ajax.send(null);

◆JSON-libの使用例(サーバサイド)

  [ JSON文字列を生成する例 ]
 JSONObject obj = new JSONObject();
 // プロパティを登録
 obj.put( "id", 1 );
 obj.put( "data", "データ1" );
 // JSON文字列を生成
 System.out.println( obj.toString() );

  [ JavaBeanからJSON文字列を生成する例 ]
 DataBean bean = new DataBean( 1, "データ1" );
 // JavaBeanからJSON文字列を生成
 JSONObject obj = JSONObject.fromBean( bean );
 System.out.println( obj.toString() );

  [ Java配列からJSON文字列を生成する例]
 DataBean db1 = new DataBean( 1, "データ1" );
 DataBean db2 = new DataBean( 2, "データ2" );
 DataBean[] data = new DataBean[] { db1, db2 };
 JSONArray array = JSONArray.fromObject( data );

  [ コレクションからJSON文字列を生成 ]
 ArrayList list = new ArrayList();
 list.add( new DataBean( 1, "データ1" ) );
 list.add( new DataBean( 2, "データ2" ) );
 JSONArray array = JSONArray.fromCollection( list );

  [ オブジェクト定義からJavaBeanを生成]
 String json = JavaScriptから取得したオブジェクト定義のJSON文字列;
 JSONObject obj  = new JSONObject( json );
 DataBean   bean = (DataBean)JSONObject.toBean( obj, DataBean.class );
 System.out.println( bean.toString() );

  [ 配列定義から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 );

【注意点】
 ブラウザによっては,JavaScriptでの処理で他の文字コードを扱えない場合がある為、JSON文字列の送受信はUTF-8で行うようにする。
 サーバサイドでは送信する文字列をUTF-8にエンコードや、Content-Typeヘッダで charset=UTF-8 の追加等が必要。

  [ 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 );
 }


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