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がデコードです。


var json = JSON.stringify({"a": {"b": {"c": ["d", "Hello json!"]}}}); //objをエンコードする

$.ajax({
async: true,
complete: function(){},
dataType: "application/json",
data: json, //JSON
processData: false,
error: function(XMLHttpRequest, textStatus, errorThrown){
//httpエラーの場合処理
}
success:function(data, dataType){
//成功した場合の処理
alert(JSON.parse(data)["b"]["c"][1]);
}
type: "POST",
url: "http://使っているドメイン/json"
});


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

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


import cgi

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from django.utils import simplejson

class JsonApi(webapp.RequestHandler):
def post(self):
str = self.request.body
try:
loaded = simplejson.loads(str)
self.response.headers['Content-Type'] = "text/plain"
self.response.out.write(simplejson.dumps(loaded["a"]))
except:
self.response.set_status(404); #parse errorなどの場合

def main():
application = webapp.WSGIApplication([('/json', JsonApi)])
run_wsgi_app(application)

if __name__ == "__main__":
main()


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

0 件のコメント:

コメントを投稿