計算機科学のブログ

実践Haskell Aesonを使ったJSONデータの処理 データ型をFromJSONとToJSONのインスタンスにする 独自に記述、parseJSON関数、fromJSON関数、(.:)演算子、(.=)演算子

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT7(実践Haskell)、LESSON 40(Aesonを使ったJSONデータの処理)、40.3(データ型をFromJSONとToJSONのインスタンスにする)、FromJSONとToJSONのインスタンスを独自に記述するのクイックチェック 40-3、40-4の解答を求めてみる。

コード

{-# LANGUAGE OverloadedStrings #-}

import qualified Data.ByteString.Lazy.Char8 as BC
import qualified Data.Text as T
import Data.Aeson

data Name = Name {firstName :: T.Text
                , lastName :: T.Text} deriving Show

instance FromJSON Name where
    parseJSON (Object v) = Name <$> v .: "firstName" <*> v .: "lastName"

instance ToJSON Name where
    toJSON (Name firstName lastName) = object["firstName" .= firstName
                                            , "lastName" .= lastName]

name :: Name
name = Name {firstName = "Will"
            ,lastName = "Kurt"}

nameJSON :: BC.ByteString
nameJSON = encode name

nameFromJSON :: Maybe Name
nameFromJSON = decode nameJSON

wrongJSON :: BC.ByteString
wrongJSON = "name"

nameFromWrongJSON :: Maybe Name
nameFromWrongJSON = decode wrongJSON

main :: IO ()
main = do
    print name
    print nameJSON
    print nameFromJSON
    print wrongJSON
    print nameFromWrongJSON

入出力結果(Terminal, Zsh)

% runghc sample03.hs
Name {firstName = "Will", lastName = "Kurt"}
"{\"firstName\":\"Will\",\"lastName\":\"Kurt\"}"
Just (Name {firstName = "Will", lastName = "Kurt"})
"name"
Nothing
%