1{-# LANGUAGE NoImplicitPrelude #-}
2{-# LANGUAGE OverloadedStrings #-}
3{-# LANGUAGE RecordWildCards #-}
4
5module Main (main) where
6
7import Prelude.Compat
8
9import Control.Applicative (empty)
10import Data.Aeson
11import Data.Monoid
12import qualified Data.ByteString.Lazy.Char8 as BL
13
14data Coord = Coord { x :: Double, y :: Double }
15             deriving (Show)
16
17-- A ToJSON instance allows us to encode a value as JSON.
18
19instance ToJSON Coord where
20  toJSON (Coord xV yV) = object [ "x" .= xV,
21                                  "y" .= yV ]
22
23  toEncoding Coord{..} = pairs $
24    "x" .= x <>
25    "y" .= y
26
27-- A FromJSON instance allows us to decode a value from JSON.  This
28-- should match the format used by the ToJSON instance.
29
30instance FromJSON Coord where
31  parseJSON (Object v) = Coord <$>
32                         v .: "x" <*>
33                         v .: "y"
34  parseJSON _          = empty
35
36main :: IO ()
37main = do
38  let req = decode "{\"x\":3.0,\"y\":-1.0}" :: Maybe Coord
39  print req
40  let reply = Coord 123.4 20
41  BL.putStrLn (encode reply)
42