Erlang で JSON パーサを書いてみた
Erlang に慣れるために JSON Parser を書いてみた。
Object, Array, Int, Float, String, null くらいは対応している。
ソースは gist。
でもエラー処理をしていないから色々ショボい…。
エスケープシーケンスの処理していない件とか
書いてみて
感想は以下の通り
- パターンマッチかわいいよパターンマッチ
- 関数型なのでやりやすいかも
- dict とか使った方がいいかな
最後の奴は proplists とか使えばとりあえず必要ないはずではある。
どっちが良いかは不明。
使い方
parseJson を呼ぶだけ
> json:parseJson("{'aaa': 10, 'bbb': 12.3, 'cccc': 'dddd'}"). {ok,{[{"aaa",10},{"bbb",12.3},{"cccc","dddd"}],[]}}
試しに ATND の検索結果をとってきてみた。
結果は長すぎるので省略。
> inets:start(), > {ok, {Status, Headers, Body}} = httpc:request("http://api.atnd.org/events/?twitter_id=shomah4a&format=json"), > io:format("~p\n", [parseJson(Body)]). {ok,{[{"results_returned",10}, {"results_available",35}, {"events", [[{"lon",139.7607447}, {"address", "\\u6771\\u4eac\\u90fd\\u5343\\u4ee3\\u7530\\u533a\\u795e\\u7530\\u795e\\u4fdd\\u753a1-105"}, {"owner_twitter_id","cpp_akira"}, {"event_url","http://atnd.org/events/11551"}, {"title","Boost.\\u52c9\\u5f37\\u4f1a #4"}, {"ended_at","2011-02-26T18:00:00+09:00"}, {"waiting",0}, {"event_id",11551}, {"updated_at","2011-01-12T21:11:28+09:00"}, {"url","http://www.iij.ad.jp/info/map/head-office.html"}, {"owner_twitter_img", "http://a1.twimg.com/profile_images/591957525/TwitterIcon_normal.png"}, {"owner_nickname","faith_and_brave"}, {"catch", "\\u52a0\\u901f\\u3059\\u308b\\u30c7\\u30fc\\u30c8\\u30bf\\u30a4\\u30e0\\u56f3\\u66f8\\u9928"}, {"owner_id",3333}, {"started_at","2011-02-26T10:00:00+09:00"}, {"description", "Boost C++ Libraries ...
とりあえず使えるかなーといったところ。