Created
October 29, 2013 12:36
-
-
Save joastbg/7213846 to your computer and use it in GitHub Desktop.
Haskell - Using Aeson for JSON (extended example from Aeson)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| -- JSON in Haskell using Aeson | |
| {-# LANGUAGE OverloadedStrings #-} | |
| import Control.Applicative ((<$>), (<*>), empty) | |
| import Data.Aeson | |
| import qualified Data.ByteString.Lazy.Char8 as BL | |
| data Coord = Coord { | |
| x :: Double, | |
| y :: Double | |
| } deriving (Show) | |
| data Person = Person { | |
| firstname :: String, | |
| lastname :: String, | |
| email :: String, | |
| age :: Int | |
| } deriving (Show) | |
| -- A ToJSON instance allows us to encode a value as JSON. | |
| instance ToJSON Coord where | |
| toJSON (Coord xV yV) = object [ "x" .= xV, "y" .= yV ] | |
| -- A FromJSON instance allows us to decode a value from JSON. This | |
| -- should match the format used by the ToJSON instance. | |
| instance ToJSON Person where | |
| toJSON (Person fn ln em age) = object [ "firstname" .= fn, "lastname" .= ln, "email" .= em, "age" .= age ] | |
| instance FromJSON Coord where | |
| parseJSON (Object v) = Coord <$> | |
| v .: "x" <*> | |
| v .: "y" | |
| parseJSON _ = empty | |
| main :: IO () | |
| main = do | |
| let req = decode "{\"x\":3.0,\"y\":-1.0}" :: Maybe Coord | |
| print req | |
| let reply = Coord 123.4 20 | |
| BL.putStrLn (encode reply) | |
| let reply2 = Person "Johan" "Astborg" "johan@gecemmo.com" 29 | |
| BL.putStrLn (encode reply2) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment