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を表しているものであれば同じようにアクセスすることができます。