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 ...

とりあえず使えるかなーといったところ。