Loading [MathJax]/extensions/tex2jax.js

2010-10-19

GWTでJSONを扱う ~JsonpRequestBuilderを利用する~

GWTでJSONPを扱う方法です。JsonpRequestBuilderを使うことで、JSONデータを自動的にクラスにマッピングしてくれます。以下のサンプルは次のJSONのデータを扱うことを前提としています。JSONPですから、外部サイトも参照可能です。
{
"name":"ochi",
"age":10,
"adress":
{"name":"Osaka"}
}
以下のプログラムは、クライアント側のプログラムです。Userクラスに自動的にマッピングしてくれます。
  1. JsonpRequestBuilder jb = new JsonpRequestBuilder();  
  2.    jb.requestObject(  
  3.       "http://XXXXX.XXX.XXXX.json",  
  4.         new AsyncCallback<JsArray<user>>() {  
  5.         public void onFailure(Throwable caught) {  
  6.            GWT.log("failure", caught);  
  7.         }  
  8.         public void onSuccess(JsArray<User> result) {  
  9.             StringBuilder sb = new StringBuilder();  
  10.             Window.alert("Success");  
  11.             for (int i = 0; i < result.length(); i++) {  
  12.                sb.append(result.get(i).getName());  
  13.             }  
  14.             resultArea.setValue(sb.toString());  
  15.         }  
  16.    });  
  17. </user>  
ここで、注意しなければならないのは、クラスの宣言方法です。下記のように、JSNI形式でなければなりません。
  1. import com.google.gwt.core.client.* ;  
  2. import java.util.* ;  
  3.   
  4. final public class User extends JavaScriptObject {  
  5.   
  6.   protected User(){  
  7.   }  
  8.   
  9.   public native java.lang.Long getId()/*-{ 
  10.      return this['id']; 
  11.   }-*/;  
  12.   
  13.   public native Address getAddress()/*-{ 
  14.      return this['address']; 
  15.   }-*/;  
  16.   
  17.   public native java.lang.String getName()/*-{ 
  18.      return this['name']; 
  19.   }-*/;  
  20.   
  21.   final static public class Address extends JavaScriptObject {  
  22.   
  23.     protected Address(){  
  24.     }  
  25.   
  26.     public native java.lang.String getName()/*-{ 
  27.        return this['name']; 
  28.     }-*/;  
  29.   
  30.   }  
  31. }  
このようなクラスを記述するのが手間ですが、実は作成を支援してくれるサイトがあります。
 JSONの雛形データをいれるとこのフォーマットに変換してくれるとても素敵なサイトです。(こういう世のためになるサイトを作りたいですね)

(追記:2010/10/22)
***.gwt.xml ファイルには
  1. <inherits name='com.google.gwt.jsonp.Jsonp' />   
の記述が必要です。

0 件のコメント:

コメントを投稿