2010-10-19

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

GWTでJSONPを扱う方法です。JsonpRequestBuilderを使うことで、JSONデータを自動的にクラスにマッピングしてくれます。以下のサンプルは次のJSONのデータを扱うことを前提としています。JSONPですから、外部サイトも参照可能です。
{
"name":"ochi",
"age":10,
"adress":
{"name":"Osaka"}
}
以下のプログラムは、クライアント側のプログラムです。Userクラスに自動的にマッピングしてくれます。
JsonpRequestBuilder jb = new JsonpRequestBuilder();
   jb.requestObject(
      "http://XXXXX.XXX.XXXX.json",
        new AsyncCallback<JsArray>() {
        public void onFailure(Throwable caught) {
           GWT.log("failure", caught);
        }
        public void onSuccess(JsArray<User> result) {
            StringBuilder sb = new StringBuilder();
            Window.alert("Success");
            for (int i = 0; i < result.length(); i++) {
               sb.append(result.get(i).getName());
            }
            resultArea.setValue(sb.toString());
        }
   });
ここで、注意しなければならないのは、クラスの宣言方法です。下記のように、JSNI形式でなければなりません。
import com.google.gwt.core.client.* ;
import java.util.* ;

final public class User extends JavaScriptObject {

  protected User(){
  }

  public native java.lang.Long getId()/*-{
     return this['id'];
  }-*/;

  public native Address getAddress()/*-{
     return this['address'];
  }-*/;

  public native java.lang.String getName()/*-{
     return this['name'];
  }-*/;

  final static public class Address extends JavaScriptObject {

    protected Address(){
    }

    public native java.lang.String getName()/*-{
       return this['name'];
    }-*/;

  }
}
このようなクラスを記述するのが手間ですが、実は作成を支援してくれるサイトがあります。
 JSONの雛形データをいれるとこのフォーマットに変換してくれるとても素敵なサイトです。(こういう世のためになるサイトを作りたいですね)

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

0 件のコメント:

コメントを投稿