実践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
%