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の取り扱い、さまざまなニーズとシナリオに適した多くのものを提供していることを覚えておいてください。