JSONをエンコード/デコードする
id:Voluntasさんのおかげでhttp:requestは使えるようになった!
で, TwitterのAPIを介していろいろ情報を取ろうとしたワケなんですが, レスポンスの形式が大体XMLかJSON. 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関数は単純な実装だから適当に実装しちゃえばいいかも.