Posted at

HaskellでのJSONパースがこんなに簡単だったとは

More than 3 years have passed since last update.

Webが絡むプログラムを書こうと思うと必ずJSONを扱う必要が出てきますよね

HaskellでJSONにはどうすればいいでしょうか?

最初は自分でパーサーを書いたり対応するレコードをいちいち定義する必要があるんだと思っていたのですがlens-aesonを使うと思った以上に簡単にJSONを扱うことが出来ました。

例えば以下の様なJSONがあったとします

{

"title": "The Godfather",
"year": 1972,
"starring": [
"Marlon Brando",
"Al Pacino",
"James Caan"
]
}

lens-aesonを使ってデータをいろいろ取り出してみましょう。

{-# LANGUAGE OverloadedStrings #-}

import Control.Lens
import Data.Aeson.Lens

jsonString :: String
jsonString = "{\"title\": \"The Godfather\",\"year\": 1972,\"starring\": [\"Marlon Brando\",\"Al Pacino\",\"James Caan\"]}"

main = do
print $ jsonString ^? key "title"
-- Just (String "The Godfather")

print $ jsonString ^? key "title" . _String
-- Just "The Godfather"

print $ jsonString ^? key "year"
-- Just (Number 1972.0)

print $ jsonString ^? key "year" . _Integer
-- Just 1972

print $ jsonString ^? key "starring" . nth 1 . _String
-- Just "Al Pacino"

どうでしょうか

JSONの文字列をパースするコードを一切書いていませんね

実はkeyを使ってアクセスした段階で秘密裏に変換が行われています

定義を見ればわかるとおりStringでもByteStringでもValueでもJSONを表しているものであれば同じようにアクセスすることができます。