2010年6月15日火曜日

GAEとjavascriptでjsonをやり取り

2週間ぶりの三森です。
今日はjsonでのデータやり取りについてちょこっと書きたいと思います。
環境は、Google App Engine(python)とjQueryの使用を想定して書きます。

json形式はjavascriptのオブジェクトをほぼそのまま表現でき、かつコンパクトなので、
クライアントからサーバーに何か階層の深いデータを送る時に使うと楽です。
json形式で送るときは、普通POSTメソッドを使うと思います。
jQueryのajaxメソッドでは、dataTypeを"application/json"に設定すれば、
urlエンコードなどをしないで生のjsonを入れて送信できます。
オブジェクトをjsonの文字列にするにはjson2.jsを使うのが簡単です。
JSON.stringifyはエンコード、JSON.parseがデコードです。

  1. var json = JSON.stringify({"a": {"b": {"c": ["d""Hello json!"]}}}); //objをエンコードする  
  2.   
  3. $.ajax({  
  4.   async: true,  
  5.   complete: function(){},  
  6.   dataType: "application/json",  
  7.   data: json, //JSON  
  8.   processData: false,  
  9.   error: function(XMLHttpRequest, textStatus, errorThrown){  
  10.      //httpエラーの場合処理  
  11.   }  
  12.   success:function(data, dataType){  
  13.      //成功した場合の処理  
  14.      alert(JSON.parse(data)["b"]["c"][1]);  
  15.   }  
  16.   type: "POST",  
  17.   url: "http://使っているドメイン/json"  
  18. });  


GAEの方では組み込みで入っているsimplejsonモジュールを使えます。
pyhtonオブジェクトとjsonとの変換は、デコードがsimplejson.loads(str),
エンコードがsimplejson.dumps(obj)です。

下のコードでは、JsonApiというクラスにurlをルーティングしてそのなかでjsonを読み込み、
responseに返します。うまくいけば"Hello json!"というアラートが出るはずです。

  1. import cgi  
  2.   
  3. from google.appengine.ext import webapp  
  4. from google.appengine.ext.webapp.util import run_wsgi_app  
  5. from django.utils import simplejson   
  6.   
  7. class JsonApi(webapp.RequestHandler):                                                
  8.   def post(self):   
  9.     str = self.request.body       
  10.     try:  
  11.       loaded = simplejson.loads(str)    
  12.       self.response.headers['Content-Type'] = "text/plain"                                               
  13.       self.response.out.write(simplejson.dumps(loaded["a"]))                    
  14.     except:   
  15.       self.response.set_status(404);  #parse errorなどの場合  
  16.   
  17. def main():  
  18.   application = webapp.WSGIApplication([('/json', JsonApi)])  
  19.   run_wsgi_app(application)  
  20.   
  21. if __name__ == "__main__":  
  22.   main()  


以上です。記事にするほどの内容か分かりませんが、ドキュメントを読まないで
勘でやっていると意外に時間がかかってしまったりするので、ここにまとめておきました。

0 件のコメント:

コメントを投稿