The roundtrip-aeson package

[ Tags: bsd3, data, library ] [ Propose Tags ]

Un-/parse JSON with roundtrip invertible syntax definitions.


[Skip to Readme]

Properties

Versions 0.2.0.0
Dependencies aeson, base (==4.7.*), bytestring, containers (==0.5.*), lens, lens-aeson, roundtrip (==0.2.*), scientific, text (==1.2.*), unordered-containers, vector [details]
License BSD3
Copyright Copyright 2014-2015 Anchor Systems and others.
Author Thomas Sutton <me@thomas-sutton.id.au>, Christian Marie <christian@ponies.io>
Maintainer Anchor Engineering <engineering@anchor.net.au>
Category Data
Home page https://github.com/anchor/roundtrip-aeson
Source repository head: git clone https://github.com/anchor/roundtrip-aeson
this: git clone https://github.com/anchor/roundtrip-aeson(tag release-0.2.0.0)
Uploaded Wed Jul 29 01:01:55 UTC 2015 by ThomasSutton
Distributions NixOS:0.2.0.0
Downloads 163 total (2 in the last 30 days)
Rating 0.0 (0 ratings) [clear rating]
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2015-07-29 [all 1 reports]
Hackage Matrix CI

Modules

[Index]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for roundtrip-aeson-0.2.0.0

[back to package description]

Roundtrip Aeson

Build Status

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.

Example

Using roundtrip-aeson is relatively straightforward:

  1. Define your data type;

  2. Define partial isomorphisms for the constructors (probably using the template haskell);

  3. Describe the syntax of its JSON representation; and

  4. 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.