JSONをエンコード/デコードする

id:Voluntasさんのおかげでhttp:requestは使えるようになった!

で, TwitterAPIを介していろいろ情報を取ろうとしたワケなんですが, レスポンスの形式が大体XMLJSON. Erlangに標準でXMLのライブラリxmerlがついているようだけど, なんだかイケていないと聞いたので, 今回はJSONで. xmerlは後で使ってみよう.

んでんで, JSONはいいとして, Erlangに標準でJSONのライブラリはついていない. どうやらYawsのモジュールのひとつとして存在するようなので, Yawsをインストールしてみる.

$ wget http://yaws.hyber.org/download/yaws-1.77.tar.gz
$ tar zxvf yaws-1.77.tar.gz
$ cd yaws
$ ./configure
$ make
$ sudo make install

だけど失敗. でも今回欲しいのはJSONエンコード/デコードのためのモジュールなので漁ってみる. srcディレクトリん中にありました. json.erlとjsonrpc.erlかな.

試しにやってみる. erlでシェルを立ち上げる.

> c(json).
ok
> inets:start().
ok
> {ok, {Status, Headers, Body}} = http:request('http://twitter.com/statuses/show/842308856.json').
- 省略
> json:decode_string(Body).
{ok,{struct,
        [{truncated,false},
         {user,
             {struct,
                 [{name,"KONDO Takahiro"},
                  {location,"Inuyama Aichi Japan"},
                  {profile_image_url,
                      "http://s3.amazonaws.com/twitter_production/profile_images/55603723/photo_normal.png"},
                  {url,"http://d.hatena.ne.jp/takkkun/"},
                  {description,[80,101,114,108,44,32,82,117,98,121,44,32|...]},
                  {followers_count,53},
                  {id,14976270},
                  {protected,false},
                  {screen_name,"takkkun"}]}},
         {in_reply_to_status_id,null},
         {text,
             [12383,12375,12363,115,121,110,99,12387,12390,12458,12503,
              12471,12519,12531,12364,12354,12387,12383,12363|...]},
         {favorited,false},
         {source,"web"},
         {created_at,"Tue Jun 24 08:54:32 +0000 2008"},
         {id,842308856},
         {in_reply_to_user_id,null}]}}

おぉぉぉー!

だけどよく見ると, structとかある. コレがオブジェクトか. Erlangの基本的なデータにハッシュはないからこうなるのね. デコードする前にエンコードを試してみたけど, こういうタプルにしないとダメみたいだ.

でもなんか値取り出すのめんどい. で見てたら, jsonrpcモジュールに取り出す関数があった. さっきの続きから.

> c(jsonrpc).
ok
> {ok, Json} = json:decode_string(Body).
- 省略
> User = jsonrpc:s(Json, user).
{struct,[{name,"KONDO Takahiro"},
         {location,"Inuyama Aichi Japan"},
         {profile_image_url,"http://s3.amazonaws.com/twitter_production/profile_images/55603723/photo_normal.png"},
         {url,"http://d.hatena.ne.jp/takkkun/"},
         {description,[80,101,114,108,44,32,82,117,98,121,44,32,74,
                       97,118,97,83,99,114,105|...]},
         {followers_count,53},
         {id,14976270},
         {protected,false},
         {screen_name,"takkkun"}]}
> Name = jsonrpc:s(User, name).
"KONDO Takahiro"

おー. なるほどなぁ.

でもこのためにjsonrpcモジュールを使うのはもったいないなぁ. s関数は単純な実装だから適当に実装しちゃえばいいかも.