2009年8月3日月曜日

Persistence API で JSONデータを保存する

OpenSocial APIは、v0.8からPersistence APIでJavaScriptのオブジェクトをそのまま永続化できるようになったと聞いていたのだけれど、どうもmixiアプリのOpenSocialコンテナは、この機能をまだ実装していないようだ。

つまり、今のところPersistence APIのnewUpdatePersonAppDataRequest()で保存できるのは普通の文字列だけということで、配列やオブジェクトを保存したい場合は、一旦、JSON形式の文字列にしてから永続化リクエストを送る。

文字列化するためには、gadgets.jsonオブジェクトのgadgets.json.stringify()というメソッドが利用できる。例えば、

var object = {"name": "John Smith", "age": 33};
var string = gadgets.json.stringify(object);
というような感じで、オブジェクトを文字列に変換できる。あとは、このJSON形式の文字列を、newUpdatePersonAppDataRequest()の第3引数に渡せばOK。
var req = opensocial.newDataRequest(); 
req.add(req.newUpdatePersonAppDataRequest(opensocial.DataRequest.PersonId.VIEWER, "key", string), "data"); 
req.send(コールバック関数); 

注意しなければならないのは、このJSONデータを受け取る際に文字列がHTMLエスケープされているので、アンエスケープしてからパースしなければならない点。

var req = opensocial.newDataRequest(); 
req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
req.add(req.newFetchPersonAppDataRequest(opensocial.DataRequest.PersonId.VIEWER, ["key"]), "data"); 
req.send(function(response) { 
  var id = response.get("viewer").getData().getId();
  var data = response.get("data").getData(); 
  var string = data[id]["key"];
  string = gadgets.util.unescapeString(string);
  var object = gadgets.json.parse(string); 
});

gadgets.util.unescapeString()を使ってHTMLアンエスケープし、gadgets.json.parse()でJSONをパースすることで、普通のJavaScriptオブジェクトが得られる。

関連エントリー:
mixiアプリのPersistence APIで日本語入力すると文字化けする場合
情報の永続化 Persistence API サンプル

0 コメント:

コメントを投稿