roundtrip allows you to write invertible syntax descriptions -- or, to put it another way, a parser and pretty printer combined -- for String or XML data. This package extends this to support constructing and destructing JSON documents.
Using roundtrip-aeson
is relatively straightforward:
-
Define your data type;
-
Define partial isomorphisms for the constructors (probably using the template haskell);
-
Describe the syntax of its JSON representation; and
-
Use that representation to build and parse JSON.
import Data.Aeson.RoundTrip
data Invoice
= Unpaid Bool Integer Bool
| Paid Double
deriving (Show)
defineIsomorphisms ''Invoice
invoiceSyntax :: JsonSyntax s => s Invoice
invoiceSyntax =
unpaid
<$> jsonField "overdue" jsonBool
<*> jsonField "total" jsonIntegral
<*> jsonField "warned" jsonBool
<|> paid
<$> jsonField "total" jsonRealFrac
main :: IO ()
main = do
-- Build a JSON representation.
let Right x = runBuilder invoiceSyntax $ Unpaid False 40 [False]
L.putStrLn $ encode x
-- Parse a JSON representation.
print $ runParser invoiceSyntax x
See tests/demo.hs for the complete source of this example.