Haskell:
JSONを活用する

方法:

HaskellはJavaScriptのようにJSONをサポートする組み込み機能を持っていませんが、Aesonなどのサードパーティ製ライブラリの助けを借りると、JSONの取り扱いが直接的になります。Aesonは、エンコーディング(Haskellの値をJSONに変換)とデコーディング(JSONをHaskellの値に解析)のための高レベルと低レベルの両方の関数を提供します。

Aesonのインストール

まず、.cabalファイルを更新するか、StackやCabalを直接使用して、プロジェクトの依存関係にAesonを追加します:

cabal update && cabal install aeson

または、Stackを使用している場合:

stack install aeson

JSONの解析

JSONデータをHaskellの型にデコードする基本的な例から始めましょう。次のような人物を表すJSONを持っているとします:

{
  "name": "John Doe",
  "age": 30
}

最初に、対応するHaskellのデータ型を定義し、FromJSONのインスタンスにします:

{-# LANGUAGE DeriveGeneric #-}

import GHC.Generics (Generic)
import Data.Aeson (FromJSON, decode)
import qualified Data.ByteString.Lazy as B

data Person = Person
  { name :: String
  , age :: Int
  } deriving (Generic, Show)

instance FromJSON Person

-- ファイルからJSONをデコードする関数
decodePerson :: FilePath -> IO (Maybe Person)
decodePerson filePath = do
  personJson <- B.readFile filePath
  return $ decode personJson

使用方法: 上に示されたJSONデータがperson.jsonに含まれていると仮定し、実行します:

main :: IO ()
main = do
  maybePerson <- decodePerson "person.json"
  print maybePerson

サンプル出力:

Just (Person {name = "John Doe", age = 30})

Haskellの値をJSONとしてエンコード

Haskellの値をJSONに戻すには、タイプをToJSONのインスタンスにしてから、encodeを使用します。

import Data.Aeson (ToJSON, encode)
import GHC.Generics (Generic)

-- 前述のPersonタイプを想定

instance ToJSON Person

encodePerson :: Person -> B.ByteString
encodePerson = encode

main :: IO ()
main = do
  let person = Person "Jane Doe" 32
  putStrLn $ show $ encodePerson person

サンプル出力:

{"name":"Jane Doe","age":32}

これらの例は、Aesonを使用してHaskellでJSONを扱う基本を示しています。Aesonは、カスタム解析ルール、複雑なネステッドJSONの取り扱い、さまざまなニーズとシナリオに適した多くのものを提供していることを覚えておいてください。