60
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

60
55
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
60
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?